持久性无知通常被定义为持久和检索标准.NET对象的能力(如果您真的坚持给他们一个名称)。和 似乎已公认的标准.NET对象的定义 是:

“ ...普通课程,您将专注于手头的业务问题而没有添加与基础设施相关的原因...”

但是,我看到人们将NHIBERNATE描述为一个允许持续无知的框架,但它是一个无法使用的框架 任何 标准.NET对象,仅标准.NET对象符合特定的设计要求,例如(例如资源):

  • 所有课程 必须 有一个默认构造函数
  • 除非课程取消关闭,并且所有成员都是虚拟的,否则某些功能无效
  • 对象身份无法正常工作,除非您滥用等于/gethashcode

(顺便说一句:在任何人感到沮丧之前,我并不是要在这里选择Nhibernate,这只是一个经常引用的示例,据说允许持续无知的框架。我敢肯定,类似的论点可以应用于其他声称相同的ORMS )

现在,尽管该类本身没有任何持久性特定于特定于框架的属性或基础类等,但对我而言,它并不是真正的“持久性无知”,因为它必须遵循一组设计准则 促进 通过所选持久性框架使用。您必须考虑到持久框架的要求设计和实施课程;如果您对此一无所知,则班级可能无法使用。

我在“持续无知”/“ poco”的定义上遇到麻烦的地方是,我看不出概念上的情况,这与添加属性(例如 [Serializable] 或者 [DataContract] 或者 [XmlType] 或任何其他持久性特定于特定于框架的注释 促进 使用该框架的实体的持久性和检索。

那么,“持久性无知”到底是什么?

显然,它的定义是能够持续“普通阶层”是谬论,因为NHIBERNATE仅是普通的,因为不参考特定于框架特定的类,而它们是非凡的,因为它们需要不寻常的设计选择,例如默认的构造函数和所有人 - 虚拟成员和等于可变类型的实现。

因此,当对象有助于使用持久性框架(在设计和结构中或通过使用特定于框架的注释),但不会自己执行任何持久性逻辑本身时,就可以合理地说“持续无知”是正确的吗?

有帮助吗?

解决方案

我会声称,像大多数事情一样,它的滑动量表。我们做的某些事情想要具有持久性的财产。从量表的一端,这东西是具有自定义构建的所有胆量,依赖性和代码,这些胆量,代码和代码以其特定的方式持续了一件事。从量表的另一端,这是神奇地发生的事情,而我们没有做更多的事情,而不是添加令牌或在某个地方设置使该事物“持续存在”的属性。为了进入量表的神奇一面,有一些框架,设计准则,惯例等,可以帮助魔术发生。我认为您可以说,可以生产出比NHibernate更少的要求和限制的工具,但实现了相同的目标。该假设工具将沿着我们的规模更远。

我不知道我非常喜欢“持久性无知”一词。它的确是关于一个对象,对实现,后备存储,缓存,这种东西 - 对象通常意识到它是否持续。但这只是语义。

其他提示

我不相信您对“持久性收集”的理解(或定义)是错误的。

真实的 问题是 泄漏的抽象. 。很简单,现有的技术使得 非常 难以实现真实的pi。

我同意MikeB的观点 - “持久性无知”是一个滑动量表,而不是给定ORM的真实/错误属性。

我对真正的100%PI的定义是,无论您多么令人费解和链接到其他类别,而无需以任何方式更改课程,您都可以坚持任何可能的POCO类。

添加ID字段,用属性进行装饰,从ORM类中继承,必须设计您的课程,以便它们很好地映射到RDB中的基础表格 - 所有这些都将“ PI分数”降低到100%以下。

也就是说,我选择使用流利的NHIBERNATE自动化,因为它似乎具有我所看过的任何ORM选项的最高PI分数。

我同意您的定义:

因此,当对象有助于使用持久性框架时,但不会自己执行任何持久性逻辑时,就可以合理地说“持续性无知”是正确的吗?

您的课程中的代码(与Atributes相反)没有任何固有的功能。持久性可能需要默认的构造函数,但没有真正持久性的代码。持久性层可以实质性地更改,可以使用不同的数据库,并且业务逻辑将保持不变。

一个持久的无知级别,是与持久框架无关的阶级。

也就是说,该类绝对不知道存在一个持久框架,它不会从该框架定义的类中继承,也不会实现该持久性框架为了工作而需要的接口。

尽管任何给定的持久性尊严框架都可能存在某些较小的限制,但仍然存在持久性尊严。

虽然您的域模型中的类(透明地使用NHIBERNATE持续存在)必须具有一个无差异构造函数,以便可以“动态地”构造它,但不需要由框架决定某个基类也不需要具有或覆盖某些框架指定的方法。

我认为,“持久性无知”是您的模型(域模型,业务模型或您可能将其称为)的属性。该模型是持久性无知的,因为它通过抽象(有时称为存储库)检索了它包含的实体的实例。这些抽象 能够 通过直接使用ORM施加,但是当您说明自己时,这有时可能会为不属于模型的对象添加要求。因此,我不会说遵守特定ORM的某些要求的模型是100%持久性无知的。

您可以使用域或应用程序的类和持久性的POCO类实现持久无知

您的域类必须忽略如何持续的信息,因此您不得包含持久性框架的任何规则(空构造函数,虚拟属性等)

这些持久性框架规则可以在您的持久性类中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top