持久性无知通常被定义为持久化和检索标准 .NET 对象(或 POCO,如果你真的坚持给它们命名)的能力。标准 .NET 对象的一个看似广为接受的定义是:
“...普通课程,您专注于手头的业务问题,而不会出于与基础设施相关的原因添加内容...”
然而,我看到人们将 NHibernate 描述为一个允许忽略持久性的框架,但它是一个不能在任何标准 .NET 对象上工作的框架,只能在符合特定设计要求的标准 .NET 对象上工作,例如(来源):
- 所有类都必须有一个默认构造函数
- 除非类未密封并且所有成员都是虚拟的,否则某些功能将不起作用
- 除非您滥用 Equals/GetHashCode,否则对象标识无法正常工作
(旁白:在任何人不高兴之前,我并不是要在这里选择 NHibernate,它只是一个经常被引用的框架示例,据称它允许持久性无知。我确信类似的论点可以应用于其他声称相同的 ORM .)
现在,尽管该类本身没有任何持久性框架特定的属性或基类等,但对我来说,它并不是真正的“不了解持久性”,因为它必须遵循一组设计准则以方便所选持久性框架的使用。您必须考虑到持久性框架的要求来设计和实现该类;如果您对此一无所知,则该课程可能无法使用。
我对“持久性无知”/“POCO”的定义有疑问的地方是,我不明白从概念上讲,这与添加属性(例如[Serializable]
or [DataContract]
or[XmlType]
或任何其他持久性框架特定的注释)有什么不同这有助于使用该框架的实体的持久性和检索。
那么,究竟什么是“执着无知”呢?
显然,将其定义为能够持久化“普通类”是一个谬误,因为 NHibernate 仅在不引用特定于框架的类方面是普通的,而它们是非凡的,因为它们需要不寻常的设计选择,例如默认构造函数和所有- 可变类型的虚拟成员和 Equals/GetHashCode 实现。
因此,当对象有助于使用持久性框架(在设计和结构中或通过使用特定于框架的注释)但本身不执行任何持久性逻辑时,是否可以合理地说“持久性无知”是正确的?