微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#中的重用抽象原理

在我们的C#MVC应用程序中,我们有很多接口将1到1映射到实现它们的对象.即:基本上,对于所创建的每个对象,已经执行了“提取界面”操作.

接口由Moq用于生成模拟对象进行单元测试.但这是接口重新使用的唯一时间.

我们系统中没有具体对象实现多个接口.

有谁能告诉我这是否会导致问题呢?如果是这样,他们会是什么?

我在想,我们的应用程序有很多重复,例如在这两个接口(在我们的服务层中编辑):唯一不同的是方法名和参数的类型,但语义上它们是与他们发送消息的存储库相同的事情:

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>

这不是关于存储库模式 – 这是关于任何层中的接口,看起来像它们共享语义相同的行为.是否值得为这些操作导出通用接口,并使“子接口”从它们继承?

至少它会保持方法的签名一致.但这会给我什么其他好处? (Liskov替代原则)

现在,方法名称和返回类型都在这个地方.

我读了马克·塞曼的“博客”,关于“重用抽象原理”,但我不明白,坦白说.也许我只是愚蠢:)我也读了福勒的标题接口的定义.

解决方法

所有这些都可以使用Repository模式进行联合
public interface IRepository<TEntity> where TEntity : IEntity
{
    T FindById(string Id);
    T Create(T t);
    bool Update(T t);
    bool Delete(T t);
}

public interface IEntity
{
    string Id { get; set; }
}

编辑

No concrete objects in our system implement multiple interfaces.

Can anyone tell me if this is going to cause problems down the road?
And if so,what would they be?

是的,如果还没有开始这样做会造成问题.

你会得到一堆不会为你的解决方添加的接口,在维护和创建它们的时候耗尽了很大一部分时间.随着你的代码库的大小增加,你会发现并不是一切都像你曾经想过的一样

请记住,接口只是一种工具,是实现抽象级别的工具.而抽象是一个概念,一个模式,一个独立实体共享的原型.

你总结了这个,

This isn’t about the repository pattern – this is about interfaces in any layer that look like they share semantically identical behavIoUrs. Is it worth deriving common interfaces for these operations and making “sub-interfaces” inherit from them?

这不是关于接口,这是关于抽象的,Repository模式演示了如何抽象出针对特定对象定制的行为.

上面给出的示例没有任何名为AddEmployee或UpdateEmployee的方法…这样的方法只是浅层接口,而不是抽象.

存储库模式的概念是显而易见的,因为它定义了一组行为,这些行为由多个不同的类实现,每个类针对特定实体进行定制.

考虑到为每个实体(UserRepository,BlogRepository等)实现Repository,并且考虑到每个存储库必须支持核心功能集(基本CRUD操作),我们可以采用该核心功能集并在界面中定义它,然后在每个Repository中实现这个界面.

现在我们可以从我们从Repository模式中学到的东西,并将其应用到我们应用程序的其他部分,从而定义一个新的接口中的一些对象所共享的核心行为,然后从接口.

public interface IVehicleOperator<TVehicle> where TVehicle : IVehicle
{
    void Accelerate();
    void Brake();
}

在这样做的时候,我们不再有1:1的映射,而是一个实际的抽象.

在我们讨论这个话题的时候,也许值得一看的是装饰图案.

原文地址:https://www.jb51.cc/csharp/95291.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐