c# - 模型类中的虚拟属性如何违反持久性无知原则?
问题描述
我刚刚阅读(修订)一些架构原则(如此处所述https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/architectural-principles)并感到有点困惑关于persistence ignorance
违反这样的原则的例子:
Properties requiring virtual keyword
所以我不清楚为什么这样的要求会违反持久性无知原则。假设我们的模型类只是 C#,由 .NET 编译器编译。要加载模型实例,只需正常创建类实例(所有属性都从相应的持久数据初始化,例如:数据记录)。要保存它,只需从模型实例中读取值并将其放回持久存储(任何类型)。
实际上Entity Framework
确实有启用一些很酷的功能(例如延迟加载)的要求……而且我确实看到 EF 在支持各种持久存储(数据库)方面做得很好,据我所知,这应该是相反的——称为a violation of the persistence ignorance principle
。
你能给我一些现实世界的例子来证明这requiring virtual properties
可能违反持久性无知原则吗?如果有的话,是不是有时我们不能仅仅遵守所有的原则,我们可能不得不在遵循好的原则和拥有好的特性之间进行权衡(比如 EF ?
解决方案
它违反持久性无知原则的原因很简单:您必须使属性virtual
使 EF 满意,因此您将业务代码二重奏更改为持久性关注点。除了直接违反原则外,使用覆盖类成员的 EF 功能会更改类的类型,因此,例如,在您的Equals
实现中,您不能再使用GetType()
比较两个实例作为对象的实际类型由 EF 在运行时生成,因此,您再次开始根据持久性问题更改域逻辑。附带说明一下,我还建议不要在大多数情况下使用 EF 的延迟加载,因为它只能同步工作,阻塞当前线程。
推荐阅读
- javascript - 在three.js中沿y轴移动对象
- ios - 如何通过手指绘制使用核心图形显示隐藏的图像?
- rust - 无法编译 bitvec 0.19.4“找到多个 `BITS`”
- python - Discord.py dm 命令
- python - 异常值:在 Django 中没有名为“PIL”的模块
- audio - 如何使用 ffmpeg 组合 2 个 opus 音频文件?
- python - 是否可以在 Python 的字典中移动或交换元素位置?
- reactjs - 如何跟踪选定的 div 并更新概览组件?
- python - 如何根据给定条件 pandas/python 删除 *some* 行
- python - 在 shell 脚本/Python 中进行 Base 64 解码和解析字符串