将DDD原则应用于C#存储库

时间:2012-07-16 13:03:25

标签: c# domain-driven-design

我有一个相对简单的域模型,如附图和简单域逻辑所示。我想在DDD定义的域对象中维护这个逻辑。

每个域对象都被定义为一个抽象类,它只包含其各自的成员和域逻辑。这些类的具体实现由存储库返回,提供给服务(使用DI)。

我遇到的问题是了解如何处理创建新实体所需的情况。例如,域逻辑指示:

可以将帐户添加到Group(创建Member实体)。

  • 将帐户添加到组后,新Member实体的Value属性必须设置为Group中已有的成员总数。< / p>

  • 本集团的其他每一位成员都必须拥有其价值 增加1。

我可以在Member AddMember(Account account)上将其作为Group方法实现。但是,此方法将以某种方式需要实例化新的Member以添加到组的成员集合。

由于域对象在应用程序中没有对层进一步引用,并且域对象自身是抽象的,我不确定如何构建成员的新实例。

我已经考虑过在abstract protected Member CreateMember()对象上定义Group方法的可能性,具体实现可以实现,但这对我来说似乎很混乱,并且让我担心我可能会误解更基本的东西。

在努力坚持DDD原则时,我将如何实施此模型?

Domain Entity Diagram

2 个答案:

答案 0 :(得分:2)

您可能想要创建一个负责创建新成员对象的MemberFactory(作为域服务)。请参阅此answer以获取一个很好的示例。

答案 1 :(得分:1)

我认为这里的根本问题是您的域对象是抽象的。域对象应该几乎总是具体的类(尽管有一些例外)来实现所有必要的域逻辑。

存储库只是外部数据源(如数据库)的接口,不应影响域的工作方式。通过让存储库返回对象的实际实现,您将域逻辑与存储库耦合。

您应该重新考虑您的设计,以便您的实体是具体的课程。您的域对象应该一起实现所有域逻辑,而不考虑外部服务/存储库。