依赖注入&使用接口?

时间:2012-02-25 17:59:04

标签: interface dependency-injection

我注意到很多开发人员为 EVERY 类定义了一个接口,该接口将使用DI框架注入。为每个类定义接口有什么好处?

2 个答案:

答案 0 :(得分:21)

应用程序组件(包含应用程序逻辑的类)实现接口非常重要,因为这促进了以下概念:

  

编程到接口,而不是实现。

这实际上是Dependency Inversion Principle。这样做允许您替换,拦截或修饰依赖项,而无需更改此类依赖项的使用者。

在很多情况下,开发人员会违反SOLID原则,但在类和接口之间进行几乎一对一的映射时。几乎可以肯定违反的原则之一是Open/closed principle,因为当每个类都有自己的接口时,不可能扩展(装饰)一组具有横切关注点的类(没有动态代理生成技巧)那是)。

在我编写的系统中,我定义了两个通用接口,它们涵盖了业务层的大部分代码。它们被称为ICommandHandler<TCommand>IQueryHandler<TQuery, TResult>

public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
    TResult Handle(TQuery query);
}

除了不必定义许多接口的良好副作用外,这还具有极大的灵活性和易于测试。您可以详细了解herehere

根据我编写的系统,我也可能使用以下接口:

  • IValidator<T>用于验证邮件
  • ISecurityValidator<T>用于对邮件应用安全限制
  • IRepository<T>,存储库模式
  • IAuthorizationFilter<T>,用于对IQueryable<T>次查询进行授权/安全过滤。

根据我编写的系统,所有组件的80%到98%之间的某个部分实现了我定义的这些通用接口之一。这使得横切关注的问题应用于那些所谓的joinpoints琐碎的事情。

答案 1 :(得分:3)

此博客条目有很多您正在寻找的答案: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/

如果您没有设计界面,那么在重构代码和/或添加增强功能时,您将陷入困境。在设计界面时,使用DI框架并不是真正的问题。 DI给你的是后期绑定和更好的编写单元测试的能力。