1

和有界上下文有疑问。

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

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

我的问题是:将广告的创建从客户委托给工厂或依赖注入是否可取?

编辑:

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

依赖注入:

我想知道解决特定情况的最佳方法是什么。该公司有广告模板库存,如果模板有库存,则可以使用,如果没有,则将其租给某人。该公司计划拥有更多股票。如果客户想在这些模板中制作广告,他会选择一个模板,如果它有库存,一切都很好。阅读本文时,我假设应该有一个服务(域)CheckAvailability(模板),由于服务的性质,它不适合特定的聚合,因为它使用了多个带有验证的聚合并查询数据库。将来会有更多的 Stocks(一些是从其他公司租来的,可能是其他人的数据库),我打算使用依赖注入将这些 Stocks 添加到服务中而不更改实现。

有界上下文:

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

Order() 客户 customer(get; private set;)

///其他属性和方法

我将不胜感激通过链接、视频、书籍提供的任何其他信息,这些信息涉及到 2 个这样的上下文(客户->订单___1:M)与同一个数据库相关的含义。谢谢你。

4

3 回答 3

2

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

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

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

现在回答你的主要问题:

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

于 2015-12-16T08:36:48.227 回答
1

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

  • 如果没有,最好将该方法移至 Advertisement另一个 BC 的聚合根,也许将其设为构造函数,或者AdvertisementFactory如果构造逻辑复杂,则将其移至一个。仅仅因为创建广告的物理世界用户是客户并不会自动暗示他们的聚合根应该具有该方法。广告创建过程可以停留在广告 BC 中,以广告应用服务作为入口点。

  • 如果有,那么客户可以发出 AdvertisementPublished广告 BC 订阅的事件。您应该知道,如果您遵循“聚合作为一致性边界”的良好做法,客户不能立即与广告保持一致,这意味着在事件发出时间和事件发生时间之间可能会出现延迟和不一致。Advertisement是持久的,因此对其他客户端可见。

    当你创建一个新的 AR 时,这通常不是问题,但请记住,Customer检查不变量并决定创建的状态Advertisement 可以更改并且同时违反不变量,之前Advertisement是持久的。

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

至于依赖注入,我在这里看不到连接——要注入的依赖是什么?

于 2015-12-16T10:30:36.807 回答
1

绝对地。

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

这是以正确的方式分离关注点,因为您不希望在创建广告的地方创建客户,反之亦然。

我猜你已经知道单一责任原则了。

于 2015-12-15T20:29:58.460 回答