Model view controller DDD和域接口/类

Model view controller DDD和域接口/类,model-view-controller,domain-driven-design,Model View Controller,Domain Driven Design,在我的应用程序中,我有一个程序集-MyApplication.Core,它包含我的所有域对象-客户、订单等,以及存储库的接口-ICCustomerRepository、IOrderRepository 我还有另一个程序集—MyApplication.Data,它包含这些接口的具体实现—OrderRepository等。存储库负责从数据库检索数据并使用域对象表示数据 我不确定的一件事是我的域对象应该是类还是接口。在我的核心组件中定义像ICCustomer、IOrder这样的接口,然后让数据组件提供

在我的应用程序中,我有一个程序集-MyApplication.Core,它包含我的所有域对象-客户、订单等,以及存储库的接口-ICCustomerRepository、IOrderRepository

我还有另一个程序集—MyApplication.Data,它包含这些接口的具体实现—OrderRepository等。存储库负责从数据库检索数据并使用域对象表示数据


我不确定的一件事是我的域对象应该是类还是接口。在我的核心组件中定义像ICCustomer、IOrder这样的接口,然后让数据组件提供具体的实现,这对我来说更有意义吗?从我到目前为止所阅读的内容来看,似乎建议使用实际的类,这背后的原因是什么?

您的聚合、实体和值对象不需要定义为接口,因为您不应该试图避免将其他代码耦合到它们。中的每一层都允许直接依赖于您的核心/模型。另一个好的经验法则是,很难想象客户的替代实现

另一方面,存储库通常定义为接口,以便使用它们的代码不会依赖于用于实现存储库的ORM或数据访问库

谈到DDD上下文之外的接口,我发现Mark Seemann的这篇文章非常有用:

对我来说,定义像ICustomer这样的接口更有意义吗, IOrder在我的核心程序集中,然后让数据程序集提供 具体实施情况如何


这可能表明您的域对象实际上是数据对象,并且设计受到反模式的影响。为什么数据汇编包含业务逻辑的实现?

您的聚合、实体和值对象不需要定义为接口,因为您不应该试图避免将其他代码耦合到它们。中的每一层都允许直接依赖于您的核心/模型。另一个好的经验法则是,很难想象客户的替代实现

另一方面,存储库通常定义为接口,以便使用它们的代码不会依赖于用于实现存储库的ORM或数据访问库

谈到DDD上下文之外的接口,我发现Mark Seemann的这篇文章非常有用:

对我来说,定义像ICustomer这样的接口更有意义吗, IOrder在我的核心程序集中,然后让数据程序集提供 具体实施情况如何


这可能表明您的域对象实际上是数据对象,并且设计受到反模式的影响。为什么数据汇编包含业务逻辑的实现?

您将在与普通非DDD开发相同的上下文中使用接口。如果你想要一个实现,你需要一个类。我还经常在知道什么时候在非DDD开发中使用接口方面遇到困难:我很确定我有一个大致的想法,但是在这种情况下,我不明白为什么存储库应该定义为接口,而域对象不应该。我想这可能是因为域对象上可以有作用于其数据的方法,如果我使用接口,每次都必须手动实现这些方法。一般来说,存储库是可以更改底层实现的地方,即使用模拟对象进行测试。为此,您需要一个接口。您将在与普通、非DDD开发相同的上下文中使用接口。如果你想要一个实现,你需要一个类。我还经常在知道什么时候在非DDD开发中使用接口方面遇到困难:我很确定我有一个大致的想法,但是在这种情况下,我不明白为什么存储库应该定义为接口,而域对象不应该。我想这可能是因为域对象上可以有作用于其数据的方法,如果我使用接口,每次都必须手动实现这些方法。一般来说,存储库是可以更改底层实现的地方,即使用模拟对象进行测试。为此,您需要一个接口。