c# - 为什么我们需要框架来做依赖解析器?

标签 c# asp.net dependency-injection dependencies

我总是看到人们总是在谈论使用像 Ninject、Unity、Windsor 这样的框架来做依赖解析器和注入(inject)。以下面的代码为例:

public class ProductsController : ApiController
{
    private IProductRepository _repository;

    public ProductsController(IProductRepository repository)  
    {
        _repository = repository;
    }
} 

我的问题是:为什么我们不能简单地写成:

public class ProductsController : ApiController
{
    private IProductRepository _repository;

    public ProductsController() :this(null)
    {}

    public ProductsController(IProductRepository repository)  
    {
        _repository = repository?? new ProductRepository();
    }
} 

在那种情况下,我们似乎不需要任何框架,即使对于我们可以轻松模拟的单元测试也是如此。

那么这些框架的真正目的是什么?

提前致谢!

最佳答案

在这种情况下,您的 ProductsController 仍然依赖于一个低级组件(在您的情况下是具体的 ProductRepository),这违反了 Dependency Inversion Principle .这是否是一个问题取决于多种因素,但它会导致以下问题:

  • ProductRepository 的创建仍然在整个应用程序中重复进行,导致您在 ProductRepository 的构造函数有机会时对整个应用程序进行彻底的更改(假设 ProductRepository 被用在更多的地方,这是很合理的)这将是一个 Open/Closed Principle violation .
  • 每当您决定使用装饰器或拦截器包装此 ProductService 时,它会导致您进行彻底的更改,以添加您需要的横切关注点(例如日志记录、审计跟踪、安全过滤等)肯定不想在所有存储库中重复该代码(再次违反 OCP)。
  • 它强制 ProductsController 了解 ProductsRepository,这可能是一个问题,具体取决于您所使用的应用程序的大小和复杂性写作。

所以这不是关于框架的使用,而是关于应用软件设计原则。如果您决定遵守这些原则以使您的应用程序更易于维护,Ninject、Autofac 和 Simple Injector 等框架可以帮助您使应用程序的启动路径更易于维护。但没有什么能阻止您在不使用任何工具或库的情况下应用这些原则。

关于c# - 为什么我们需要框架来做依赖解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25638961/

相关文章:

c# - IIS 上 ASP.NET 页面的 Restful URL

c# - 在 Delphi 中使用 .NET 程序集

c# - 需要有关 RSS Feed 和 wordpress 的帮助

ASP.NET 自定义用户控件动态添加

asp.net - jQuery-AJAX 将下拉列表重新绑定(bind)到存储过程的结果

asp.net - 如何对外部依赖项使用依赖项注入(inject)?

dependency-injection - "Inversion of Control"、 "Dependency inversion"和 "Decoupling"之间的区别

c# - Orchard CMS : RemoteRss from Vandelay Industries

c# - 如何在 C# 中验证价格范围值

c# - RegisterCollection 来自以前使用简单注入(inject)器注册的类型