在我的应用程序中,我有一个程序集 - MyApplication.Core,它包含我的所有域对象 - 客户,订单等,以及存储库的接口 - ICustomerRepository,IOrderRepository
我有另一个程序集 - MyApplication.Data,它包含这些接口的具体实现 - OrderRepository等。存储库负责从数据库中检索数据并使用域对象呈现它。
我不确定的一件事是我的域对象应该是类还是接口。在我的Core程序集中定义像ICustomer,IOrder这样的接口,然后让Data程序集提供具体的实现会更有意义吗?从我到目前为止所读到的,似乎推荐了实际课程,这背后的原因是什么?
答案 0 :(得分:3)
您的聚合,实体和价值对象不需要被定义为接口,因为您不应该试图避免将其他代码与它们耦合。 Onion Architecture中的每个图层都允许直接依赖于您的Core / Model。另一个好的经验法则是很难想象客户的另一种实现方式。
另一方面,存储库通常被定义为接口,因此使用它们的代码不会依赖于用于实现存储库的ORM(或数据访问库)。
说到DDD上下文之外的接口,我发现Mark Seemann的这篇文章非常有用:Interfaces are not abstractions。
对我来说定义像ICustomer这样的接口会更有意义吗 IOrder在我的Core程序集中,然后提供Data程序集 具体实施?
这可能表明您的域对象实际上是数据对象,并且设计受到AnemicDomainModel反模式的影响。为什么数据汇编包含业务逻辑的实现?