我注意到很多开发人员为 EVERY 类定义了一个接口,该接口将使用DI框架注入。为每个类定义接口有什么好处?
答案 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);
}
除了不必定义许多接口的良好副作用外,这还具有极大的灵活性和易于测试。您可以详细了解here和here。
根据我编写的系统,我也可能使用以下接口:
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给你的是后期绑定和更好的编写单元测试的能力。