我有一个相对简单的域模型,如附图和简单域逻辑所示。我想在DDD定义的域对象中维护这个逻辑。
每个域对象都被定义为一个抽象类,它只包含其各自的成员和域逻辑。这些类的具体实现由存储库返回,提供给服务(使用DI)。
我遇到的问题是了解如何处理创建新实体所需的情况。例如,域逻辑指示:
可以将帐户添加到Group
(创建Member
实体)。
将帐户添加到组后,新Member
实体的Value
属性必须设置为Group
中已有的成员总数。< / p>
本集团的其他每一位成员都必须拥有其价值 增加1。
我可以在Member AddMember(Account account)
上将其作为Group
方法实现。但是,此方法将以某种方式需要实例化新的Member
以添加到组的成员集合。
由于域对象在应用程序中没有对层进一步引用,并且域对象自身是抽象的,我不确定如何构建成员的新实例。
我已经考虑过在abstract protected Member CreateMember()
对象上定义Group
方法的可能性,具体实现可以实现,但这对我来说似乎很混乱,并且让我担心我可能会误解更基本的东西。
在努力坚持DDD原则时,我将如何实施此模型?
答案 0 :(得分:2)
您可能想要创建一个负责创建新成员对象的MemberFactory(作为域服务)。请参阅此answer以获取一个很好的示例。
答案 1 :(得分:1)
我认为这里的根本问题是您的域对象是抽象的。域对象应该几乎总是具体的类(尽管有一些例外)来实现所有必要的域逻辑。
存储库只是外部数据源(如数据库)的接口,不应影响域的工作方式。通过让存储库返回对象的实际实现,您将域逻辑与存储库耦合。
您应该重新考虑您的设计,以便您的实体是具体的课程。您的域对象应该一起实现所有域逻辑,而不考虑外部服务/存储库。