【发布时间】:2015-07-16 16:26:18
【问题描述】:
在我们的 C# MVC 应用程序中,我们有许多将 1 到 1 映射到实现它们的对象的接口。即:基本上,对于创建的每个对象,都执行了“提取接口”操作。
Moq 使用这些接口为我们的单元测试生成模拟对象。但这是唯一一次重复使用接口。
我们的系统中没有具体的对象实现多个接口。
谁能告诉我这是否会在未来造成问题?如果是这样,它们会是什么?
我在想,我们的应用程序有很多重复,例如在这 2 个接口中(编辑:在我们的 SERVICES 层中)唯一不同的是方法名称和它们采用的参数类型,但是从语义上讲,他们对发送消息的存储库做同样的事情:
interface ICustomer
{
void AddCustomer(Customer toAdd);
void UpdateCustomer(Customer toUpdate);
Customer GetById(int customerId);
}
interface IEmployee
{
void AddEmployee(Employee toBeAdded);
void UpdateEmployee(Employee toUpdate);
Employee GetById(int employeeId);
}
这就是我认为重用抽象原则的用武之地,即将代码转换为:
public interface IEmployee: IAdd<Employee>, IUpdate<Employee>, IFinder<Employee>
这与存储库模式无关 - 这是关于接口在任何层,它们看起来共享语义相同的行为。是否值得为这些操作派生通用接口并让“子接口”继承它们?
至少它会保持方法的签名一致。但这会给我带来什么其他好处呢? (里氏替换原则除外)
现在,方法的名称和返回类型到处都是。
我阅读了 Mark Seemann 关于重用抽象原则的博客,但坦率地说,我不明白。也许我只是愚蠢:) 我还阅读了 Fowler 对 Header Interfaces 的定义。
【问题讨论】:
-
听起来您需要一个通用存储库。
-
我必须自己查找重用的抽象,但您的建议看起来像接口隔离原则,它是 SOLID 代码的一部分。这不是一件坏事:)
-
我提到的这些方法实际上是服务(业务)层的一部分。我们没有使用 DDD。在我们的实现中,MVC 控制器使用“服务”(按照 EmployeeServices、CustomerServices 命名的对象),它们实现了与上述类似的接口。他们在另一层“使用”存储库,在实体框架中实现,具有非常相似的接口。
-
FWIW,我的博客不是了解 RAP 的合适来源 - Jason Gorman 是 original source of the principle。
-
等等,这是一个看起来很疯狂的界面。接口不应引用内部的具体类。 ICustomer AddCustomer 应该采用 ICustomer,而不是 Customer。你也想要那里的一些属性
标签: c# oop abstraction solid-principles