代码之家  ›  专栏  ›  技术社区  ›  Greg Beech

到底什么是“坚持无知”?

  •  34
  • Greg Beech  · 技术社区  · 16 年前

    seemingly well accepted definition of a standard .NET object 是:

    “…普通类,您可以将注意力集中在手头的业务问题上,而无需添加与基础架构相关的内容…”

    然而,我看到有人将NHibernate描述为一个允许持久性忽略的框架,但它是一个无法工作的框架 任何 标准.NET对象,例如,仅符合特定设计要求的标准.NET对象( source

    • 所有班级 必须
    • 除非类未密封且所有成员都是虚拟的,否则某些功能无法工作
    • 除非滥用Equals/GetHashCode,否则对象标识无法正常工作

    (旁白:在任何人感到不安之前,我不想在这里挑刺NHibernate,它只是一个经常被引用的框架示例,据说它允许持久性。我相信类似的参数也可以应用于其他声称相同的ORM。)

    现在,尽管类本身没有任何特定于持久性框架的属性或基类等,但对我来说,它并不是真正的“不知道持久性”,因为它必须遵循一组设计准则来实现 促进 由所选的持久性框架使用。您必须在设计和实现类时牢记持久性框架的要求;如果你对它一无所知,全班同学可能无法使用它。

    [Serializable] [DataContract] [XmlType] 或者任何其他特定于持久性框架的注释 使用该框架的实体的持久性和检索。

    那么,“坚持无知”到底是什么呢?

    显然,将其定义为能够持久化“普通类”是一个谬误,因为NHibernate类仅在不引用特定于框架的类的情况下是普通的,然而,它们非常特别,因为它们需要不寻常的设计选择,例如默认构造函数和所有虚拟成员,以及可变类型上的Equals/GetHashCode实现。

    因此,当对象促进了持久性框架的使用(无论是在设计和结构上,还是通过使用特定于框架的注释),但它们本身不执行任何持久性逻辑时,说“持久性忽略”是正确的吗?

    8 回复  |  直到 16 年前
        1
  •  10
  •   Mikeb    16 年前

    我想说的是,和大多数事情一样,这是一个滑动比例。我们制造的一些东西希望具有持久性。在规模的一端,这个东西拥有所有的胆量、依赖性和代码,这些都是定制构建的,以便以特定的方式持久化这个东西。在天平的另一端,一些事情奇迹般地发生了,我们所做的只是添加一个标记或在某个地方设置一个属性,从而导致事情“持续”。为了达到规模的神奇一面,有一些框架、设计指南、惯例等帮助神奇发生。我想你可能会争辩说,可以生产一种比NHibernate要求和限制更少但追求相同目标的工具;这一假设性工具将在我们的规模上更进一步。

    我不知道我这么喜欢“坚持无知”这个词;它实际上是关于一个对象不知道实现、备份存储、缓存之类的东西——尽管对象通常知道它是否是持久的。但这只是语义学。

        2
  •  7
  •   Vijay Patel    16 年前

    这个 问题在于 leaky abstractions . 很简单,现有的技术使它 非常 难以实现真正的PI。

        3
  •  4
  •   Tom Bushell    16 年前

    添加ID字段,用属性装饰,从ORM类继承,必须设计类,使它们能够很好地映射到RDB中的底层表,所有这些都会将“PI分数”降低到100%以下。

    也就是说,我选择使用Fluent NHibernate自动映射,因为它似乎是我看过的所有ORM选项中PI得分最高的。

        4
  •  3
  •   Frederik Gheysels    16 年前

    持久性无知类是一个不与持久性框架绑定的类。

    也就是说,该类完全不知道存在一个持久性框架,它不继承由该框架定义的类,也不实现该持久性框架工作所需的接口。

        5
  •  1
  •   djna    16 年前

    因此,这样说是否合理 “坚持无知”是正确的 持久性框架,但不支持 他们自己?

        6
  •  0
  •   yfeldblum    16 年前

    尽管任何给定的持久性忽略框架都可能需要某些较小的约束,但持久性忽略仍然存在。

    虽然域模型中的类(使用NHibernate透明持久化)必须具有无参数构造函数,以便可以“动态”构造它,但不要求它具有框架指定的特定基类,也不要求它具有或重写特定框架指定的方法。

        7
  •  0
  •   Klaus Byskov Pedersen    16 年前

    在我看来,“持久性无知”是您的模型(域模型、业务模型或您可能称之为的任何模型)的一个属性。该模型不知道持久性,因为它通过抽象(有时称为存储库)检索它所包含的实体的实例。这些抽象 可以通过直接使用ORM来实现,但当您陈述自己时,这有时可能会向不属于您的模型的对象添加需求。因此,我不会说遵守特定ORM的某些要求的模型是100%不知道持久性的。

        8
  •  0
  •   Miguel Caravantes    8 年前

    当您要持久化域对象时,可以使用域类或持久化中的应用程序和POCO类来实现持久化,将其映射到持久化类中,并使用持久化对象与NHibero other framework一起存储

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

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