首页 > 解决方案 > 模型类中的虚拟属性如何违反持久性无知原则?

问题描述

我刚刚阅读(修订)一些架构原则(如此处所述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 ?

标签: c#architectureprinciples

解决方案


它违反持久性无知原则的原因很简单:您必须使属性virtual使 EF 满意,因此您将业务代码二重奏更改为持久性关注点。除了直接违反原则外,使用覆盖类成员的 EF 功能会更改类的类型,因此,例如,在您的Equals实现中,您不能再使用GetType()比较两个实例作为对象的实际类型由 EF 在运行时生成,因此,您再次开始根据持久性问题更改域逻辑。附带说明一下,我还建议不要在大多数情况下使用 EF 的延迟加载,因为它只能同步工作,阻塞当前线程。


推荐阅读