C# 什么';包装通用接口的目的是什么?

C# 什么';包装通用接口的目的是什么?,c#,generics,interface,C#,Generics,Interface,我在一个项目中看到了许多接口,它们只是包装了一个泛型类 例如: public interface IAssertionViewModelMapper : IMapper<Assertion, AssertionViewModel> {} public interface ISearchPageViewModelMapper : IMapper<IList<Tag>, SearchPageViewModel> {} 公共接口IAssertionViewMod

我在一个项目中看到了许多接口,它们只是包装了一个泛型类

例如:

public interface IAssertionViewModelMapper : IMapper<Assertion, AssertionViewModel>
{}

public interface ISearchPageViewModelMapper : IMapper<IList<Tag>, SearchPageViewModel>
{}
公共接口IAssertionViewModelMapper:IMapper
{}
公共接口ISearchPageViewModelMapper:IMapper
{}

有人能解释一下他们为什么这么做吗?我的意思是我可以直接实现IMapper接口

有时候,团队决定不希望依赖那些可能会发生更改并被弃用的内置实现。所以他们包装了所有的东西,类,接口,类型,并在他们的项目中使用它们。他们希望有一天,当对某些框架组件的支持被放弃时,他们可以简单地修改包装器,而不需要重写整个软件


我工作的地方也是这样。当然,所有东西都是十年前包装好的,我们只使用定制包装。正如你可能猜到的那样,时间已经证明,大部分时间是不需要的。当某些东西被弃用时,没有真正节省时间。我们仍然需要修改一些花了很多时间的代码,但是包装器在任何方面都没有帮助。相反,包装器是经常遇到的障碍,因为它们当时没有完全包装东西,所以我们必须时不时地扩展包装器。

这样做会创建一种新的接口类型。因此,如果您声明引用:

IAssertionViewModelMapper avmm = null;
如果对象实现
IMapper
,则无法将对象指定给该对象。它们是不同的类型,并且只在一个方向上具有分配兼容性:派生的可以分配给基

因此,如果有人为了简化代码而尝试这种技巧,比如在C中使用typedef,那么他们将来可能会积累一些混乱。

Microsoft代码分析(又称FxCop)包含一条禁止这样做的规则。但是,创建这样的新接口有几个优点:

  • 新名称可以更好地描述接口的意图(但是,C#中的别名也可以做到这一点)
  • 在该接口上需要新方法时,这可以节省您几分钟的时间,因为您已经定义了它
  • 当从
    IMapper
    派生的大多数接口实际定义新方法时,它可以使代码库更加一致。很容易发现接口,即使它们没有定义新成员