代码之家  ›  专栏  ›  技术社区  ›  coding4fun

构建域对象?

  •  2
  • coding4fun  · 技术社区  · 14 年前

    首先,我总是假设您的业务对象将具有某种类型的连接性(通过构造函数传入),无论是存储库还是数据库连接或其他什么。看来我错了。

    您是否只是通过一个组合来构造您的域对象,该组合传递所有数据,并可能传递一些底层集合的添加/删除函数(顺序-->订单详情)?因此,在DataMapper中,您将从DB中的元组构造buisness对象,然后通过存储库将它们返回到应用程序层,在那里您将使用它们?然后应用层和;DL需要对业务对象的引用。如果您不使用ORM,或者甚至使用ORM,这当然会迫使您构建自己的延迟加载机制,因为此时您将被断开连接。当然,您不希望在所有情况下都加载所有底层数据。

    1 回复  |  直到 14 年前
        1
  •  3
  •   RivieraKid    13 年前

    根据域驱动的设计,域对象是不知道持久性的。这意味着-它们不应该包含连接到数据库的基础结构代码。然而,存储库抽象被认为是域模型的一部分。因此,这是'允许'使用这些,但我个人喜欢避免。

    如果你说的是域对象的建模,那么不,把它们建模成愚蠢的数据包并不是一件好事。这会导致 anemic model

    如果你说的是在从持久性机制中检索域对象时重建它们,那么是的——基本上这只是从头开始重建域对象。但这里有一个棘手的部分-这个重建和其他与持久性相关的问题不应该侵入您的域。您不应该仅仅为了使持久性工作而拥有没有任何验证的公共添加/删除函数。在现实中-很难保持模型完全干净(事实上,它已经和你正在使用的编程语言搞砸了,除了你自己建模的现实之外,不存在可以容纳它的纯媒体),而且总是会有一些隐含的依赖关系(例如-当使用NHibernate ORM时,所有东西都必须标记为虚拟的)。

    认为 . 从阅读开始 'blue book' sample application 直到你 了解原因

    编辑:哦。。。忘了 ddd yahoo group


    看看这个(过于简单和糟糕的一个)例子。从客户端来看,除非你作弊,否则你将无法创建一个拥有name.Length>50

    public class Person{
      public Person(string name){ 
          if (name.Length>50) throw new ArgumentException
            ("Person name length should not exceed 50 characters");  
          Name=name;
        }
        public string Name {get;private set;}
    }
    

    typeof(Partner).GetProperty("Name").SetValue(partner,nameFromDB);
    

    这听起来像是一个非常复杂的话题,可能很多人认为这是使用领域驱动的设计..不是

    域驱动的设计在一开始确实令人困惑。最糟糕的事情可能发生(通常发生)是当开发人员开始 不知从哪儿冒出来的 he is doing it right

    还有。。。在.NET流行文化中使用的域驱动设计实际上是域驱动设计吗

    Some 试着解释一下 why . 一些只是 hate