依赖注入和使用接口?

Posted

技术标签:

【中文标题】依赖注入和使用接口?【英文标题】:Dependency Injection & using interfaces? 【发布时间】:2012-03-15 19:59:28 【问题描述】:

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

【问题讨论】:

为什么要关闭?花点时间发表评论怎么样? -1 请参阅常见问题解答点“我可以在这里问什么样的问题?”和“我不应该在这里问什么问题”。他们是名单上的前两位。 您的问题是有效且有趣的问题,但它有点模糊且不是很具体(例如没有代码示例),这就是为什么人们反对它并投票决定关闭它。 相关:***.com/questions/5144622/… 【参考方案1】:

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

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

这实际上是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);

除了不必定义许多接口的好处之外,这还提供了极大的灵活性和易于测试。你可以阅读更多关于它的信息here 和here。

根据我写的系统,我可能还会用到如下接口:

IValidator&lt;T&gt; 用于验证消息 ISecurityValidator&lt;T&gt; 对消息应用安全限制 IRepository&lt;T&gt;,仓库模式 IAuthorizationFilter&lt;T&gt; 用于对 IQueryable&lt;T&gt; 查询应用授权/安全过滤。

根据我编写的系统,80% 到 98% 的所有组件都实现了我定义的这些通用接口之一。这使得将横切关注点应用于所谓的joinpoints 变得微不足道。

【讨论】:

【参考方案2】:

如果您不针对接口进行设计,那么在重构代码和/或添加增强功能时,您将束手无策。在设计界面时,使用 DI 框架并不是真正的问题。 DI 为您提供的是后期绑定和更好的编写单元测试的能力。

【讨论】:

web.archive.org/web/20090403080558/http://benpryor.com/blog/…

以上是关于依赖注入和使用接口?的主要内容,如果未能解决你的问题,请参考以下文章

运用Unity实现依赖注入[结合简单三层实例]

接口和抽象之间有啥区别以及依赖注入如何[重复]

依赖注入

依赖注入的实现方式:设值注入和构造方法注入

依赖注入和显式接口实现

python中的接口和依赖注入