DDD聚合根

时间:2015-12-15 19:42:57

标签: c# domain-driven-design bounded-contexts

我对和有限的背景有疑问。

假设有两个有界的上下文。在第一个中,聚合根是能够在网页上发布广告的客户。我认为这属于他的行为,反过来他有一个PublishAdvertisement()的方法。 但是第二个有界的上下文将广告作为聚合。由于其属于客户的性质,广告具有客户财产。

客户和广告在系统和数据库中都是唯一的。

我的问题是: 是否建议将Customer的广告创建委托给工厂或依赖注入?

编辑:

感谢您的回答并为缺乏信息而道歉。

依赖注入:

我想知道解决特定情况的最佳方式是什么。该公司有一个Stock of Advert模板,如果模板有库存,它有利于使用,如果不是,则将其租给某人。该公司计划拥有更多股票。如果客户想要在这些模板中制作广告,他会选择一个模板,如果它的库存都很好。阅读本文我假设应该有一个服务(域)CheckAvailability(模板),由于它不适合特定聚合的服务的性质,因为它使用多个聚合与验证和查询数据库。将来会有更多的股票(其中一些是从其他公司租来的,也许是别人的数据库),我正在计划使用依赖注入将这些股票添加到服务而不改变实现。问题是,这看起来是个好主意吗?

有界的背景:

关于有界上下文和数据库。是的,有一个数据库对象和两个使用相同数据库对象的上下文。由于属于客户,订单引用了客户,看起来像这样

令() 客户客户(获取;私人集;)

///其他属性和方法

我希望通过链接,视频,书籍获得任何其他信息,例如具有2个这样的上下文(Customer-> Order ___ 1:M)与同一数据库相关的含义。谢谢。

3 个答案:

答案 0 :(得分:2)

  

客户和广告在系统和数据库中都是唯一的。

如果是这种情况,那么在使用相同数据库对象的两个有界上下文中包含这些概念是一个问题!两个有界上下文之间的分离很强,所以它们不应该通过更改相同的DB对象进行通信。

所以我认为你有一些重大的设计问题。首先尝试通过创建与现实问题相对应的模型来修复它们,并与您的领域专家讨论。

现在回答你的主要问题:

通过工厂创建实体是个好主意。工厂隐藏(可能很复杂的)机制来创建实体并为其提供所需的服务。工厂首先通过DI接收这些服务,并在实例化期间将它们转发给实体。

答案 1 :(得分:1)

绝对。

有一件事是关联域对象,另一件事就是使用它们。 广告有一些关联的客户客户广告必须在各自的域层中创建(< em>即至少存储库和服务...... )。

这是以正确的方式分离问题,因为您不希望在创建广告的位置创建客户,反之亦然。

我猜你已经知道了single responsibility principle

答案 2 :(得分:1)

Customer.PublishAdvertisement()强制执行的客户相关不变量是什么?

  • 如果没有,你最好将该方法移动到 Advertisement聚合其他BC中的根,如果构造逻辑复杂,可能使其成为构造函数或AdvertisementFactory。仅仅因为创建广告的物理世界用户是客户并不会自动暗示他们的聚合根应该具有该方法。广告创建过程可以保留在广告BC中,广告应用服务作为切入点。

  • 如果有,那么客户可以发出一个 广告BC订阅的AdvertisementPublished事件 至。你应该知道,如果你遵循“聚合为 一致性边界“良好实践,客户不能立即 与广告一致,这意味着可能会有延迟 可以在发出事件和持久存储Advertisement之间引入不一致,从而对其他客户端可见。

    创建新AR时通常不是问题,但请记住,检查不变量并决定创建Customer Advertisement的状态可能会发生变化并且在保留Advertisement之前,会同时违反不变量。

    显然,鉴于2个BC共享一个公共数据库(这可能不像@theDmi所指出的那样好),您可以决定打破该规则并使您的事务跨越2个聚合。如果您只是持久保存新广告而不修改可能同时访问的广告,则不一定那么糟糕。

就依赖注入而言,我在这里看不到连接 - 要注入的依赖是什么?