在阅读埃文斯和尼尔森的书我仍然不知道该如何管理数据访问域中的驱动的项目。应该增删改的方法的一部分的储存库,即OrderRepository.GetOrdersByCustomer(客户)或是否应部分的实体:客户。GetOrders().后一种办法似乎更多的面向对象的,但它将分发数据的访问对于一个单一的实体种类之多的对象,即客户。GetOrders(),发票。GetOrders(),ShipmentBatch.GetOrders()等。什么有关插入和更新?

有帮助吗?

解决方案

污物上下的方法应当一部分的仓库...ish。但我认为你应该问问为什么你有一大堆的污物的方法。他们做什么 真的 做什么?它们是什么 真的 用的?如果你真的调出数据的存取模式应用程序使用,我认为它使得存储库中一个更为有用,让你有散弹枪手术时某些类型的变化发生在您的领域。

CustomerRepo.GetThoseWhoHaventPaidTheirBill()

// or

GetCustomer(new HaventPaidBillSpecification())

// is better than

foreach (var customer in GetCustomer()) {
    /* logic leaking all over the floor */
}

"保存"类方法也应的一部分,储存库。

如果你有总的根源,这让你有一个储存库中的爆炸,或具有逻辑的传播出所有超过:你不必4x#实体数据接入模式的,只是那些你实际使用的总的根源。

这是我的$.02.

其他提示

DDD通常更喜欢将储存库的模式的活动记录图案你暗示在与客户。保存。

一个缺点的活动记录模型,它几乎可以假定一个单一的持久性的模式,禁止一些特别侵入的代码(在大多数语言)。

储存库的接口定义中域层,但不知道数据是否存在一个数据库或没有。与储存库的模式,我可以创建一个InMemoryRepository所以我可以试域中的逻辑隔离,并使用依赖注射应用程序服务层化SqlRepository,例如。

对许多人来说,具有特殊的存储库的只是为了测试的声音冷笑话,但是如果您使用的储存库的模式,可能会发现,你真的不需要一个数据库,为特定应用程序;有时一个简单的FileRepository会做的伎俩。婚礼给自己一个数据库之前你知道你需要它是潜在的限制。即使一个数据库是必要的,这是一个很大更快的运行测试对一个InMemoryRepository.

如果你没有太多的领域逻辑,你可能不需要DDD。Email是相当适合于很多问题,特别是如果有大多数据和只是一点点的逻辑。

让我们退后一步的第二个。Evans建议,库返回聚集根而不仅仅是实体。所以假设你的客户是根聚集,包括订单,那么,当你提取客户从其储存库,订单来。你会访问的订单,通过导航的关系,从顾客的订单。

customer.Orders;

所以回答你的问题,增删改操作上存在根聚集储存库。

CustomerRepository.Add(customer);
CustomerRepository.Get(customerID);
CustomerRepository.Save(customer);
CustomerRepository.Delete(customer);

我已经做到了这两种方法,你正在谈论的,我的首选办法,现在是持久性的无知(或普莫--普通的Ole'.净的对象)的方法在您的领域类只是担心域课程。他们什么都不知道他们是如何保持或甚至如果他们仍然存在。当然你必须要有务实的关于这个时候,并允许的事情如Id(但即使是那么我只是使用一种层级式的Id所以我可以有一个单一点的东西喜欢默认值的生活)

这主要原因是,我力求遵循的原则单一责任。通过下面这个原则我发现我的代码的更多的测试和维护。它也很容易做出改变的时候他们是必要的,因为我只有一件事要考虑。

有一件事要注意的是该方法的膨胀,储存库可能遭受.GetOrderbyCustomer..GetAllOrders..GetOrders30DaysOld..等等等等。一个很好的解决这个问题是来看看的查询对象的图案。然后储存库可以在查询对象的执行。

我也强烈建议找到的东西喜欢它能够.它包括一个很大的概念,使仓库的所有用的(身份地图,缓存,查询对象..)

即使在DDD,我会保持数据的接入类别和程序分开的实体。

原因是,

  1. 可测性提高
  2. 分离的问题和模块化设计
  3. 更易于维护长远来说,作为添加实体,例行程序

我不是专家,只是我的意见。

恼人的事情Nilsson的申请DDD&P是,他总是始于"我不会那样做在现实世界的应用程序但是..."然后他例子如下。回到主题:我认为OrderRepository.GetOrdersByCustomer(客户)的路要走,但还有一个讨论ALT.Net 邮件列表(http://tech.groups.yahoo.com/group/altdotnet/)关于DDD。

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