.net 构建您的域对象?

.net 构建您的域对象?,.net,domain-driven-design,.net,Domain Driven Design,我正在尝试学习领域驱动设计,所以我确信这将是许多问题中的第一个(我已经想到了至少几个问题,但我不想把我的问题分割开来)。我使用的是Dino Esposito的“为企业构建Microsoft.NET解决方案”,在某些情况下,这是非常抽象的 首先,我总是假设您的业务对象将具有某种类型的连接(通过构造函数传递),无论是存储库还是数据库连接或其他类型。看来我错了 您是否只是通过组合传入所有数据以及底层集合的一些添加/删除函数(Order-->OrderDetails)来构造域对象?因此,在DataMap

我正在尝试学习领域驱动设计,所以我确信这将是许多问题中的第一个(我已经想到了至少几个问题,但我不想把我的问题分割开来)。我使用的是Dino Esposito的“为企业构建Microsoft.NET解决方案”,在某些情况下,这是非常抽象的

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


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

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

如果您谈论的是域对象的建模,那么不,主要是将它们建模为哑数据包不是一件好事。这就导致了

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

但是,如果您想了解领域驱动设计,您并没有专注于应该做什么。领域驱动设计的核心是语言的普遍性和明确建模的业务。这是关于你思考的方式。从阅读开始。两次。请查看Szymon Pobiega的文章,直到您理解这些代码行背后的原因

编辑:哦。。。忘了哪一个也是很好的信息来源


在你的帖子中,有一件事让我感到困惑,那就是你不应该把他们当作愚蠢的财产袋来“建模”,而应该是“重建”,这样就可以了

看看这个(过于简单和糟糕的)例子。从客户端来看,除非你在作弊,否则你将无法创建一个名为.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);

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

领域驱动的设计在一开始确实令人困惑。最糟糕的事情可能发生(通常也会发生)是当开发人员开始相信(我自己也在那里,可能我还在那里):

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


这导致了很多混乱和谎言。试着解释一下。有些人就是这样。

好吧,我想我开始意识到迪诺的书并不是最好的解决方案。我试图以更为流行的.Net为重点学习领域驱动设计,但显然这并没有教会我足够的东西。在你的帖子中,有一件事让我感到困惑,那就是你不应该把他们当作愚蠢的财产袋来“建模”,而应该是“重建”,这样就可以了。你的意思是你的域实体的消费者不应该把它们看作是财产袋,但这样构造它们是可以的吗?这听起来像是一个非常复杂的话题,可能很多人认为正在使用领域驱动的设计,但他们不是。再次感谢您的时间和反馈。你帮了我很多忙。还有一个简单的问题。如果我想读一本更注重技术的书,你认为阅读“应用领域驱动的设计和模式:C#和.NET中的示例”是一个不错的选择(它似乎受到高度重视),还是你会远离技术焦点,继续读eric evans的领域驱动的设计书。我想我希望有什么东西能帮助我实现,比如在LINQ/Lamda中实现一个存储库。不要试图在实际项目中使用ddd。在玩具项目上使用它(最好是那些你还不知道商业领域的项目)。关于技术细节,我认为最好使用谷歌,阅读大量博客文章,并将多个信息源融合在一起。