我在一些我工作的领域驱动设计企业应用程序中看到的一件事情是使用与领域实体相同的接口,其中属性和函数存在一对一的映射。实际上,领域对象总是通过其一对一的接口使用,并且所有领域实体都具有这种风格的一对一接口。
例如:
领域对象Account:
public class Account : IAccount
{
public string Name {get;set;}
//...some more fields that are also in IAccount
public decimal Balance {get;set;}
}
并且它有一个匹配的界面
public interface IAccount
{
string Name {get;set;}
//... all the fields in Account
decimal Balance {get;set;}
}
但最近我越来越相信这实际上是一个反模式。
我向一些开源社区的架构师咨询了一下,他们说这基于设计错误或缺陷,在设计链的某个地方。所以我告诉我的同事不要为领域对象创建接口。 因为它们没有任何目的,并且每当您更新领域实体时都必须更新接口。
首先提出的声明是这些接口提供“解耦”,但我反驳说,因为这些接口与领域实体具有一对一的关系,它们实际上并没有提供任何解耦,接口的更改意味着领域实体的更改,反之亦然。
下一个声明是我们需要接口进行测试。 我的反驳是Rhino-mocks为具体类的模拟和存根提供支持。 但是他们声称Rhino-mocks在处理具体类时会出现问题。 我不知道我是否买单了,即使rhino-mocks与具体类有问题,也不一定意味着我们应该为领域实体使用接口。
所以我很好奇:
为什么您的领域实体需要一对一接口?
为什么不?
这是好的还是坏的惯例?
感谢您的阅读! 编辑:我应该指出,我一直在使用接口,如果需要,我相信我会随时使用接口。 但我特别指的是具有一对一接口的领域实体。