我总是看到人们总是在谈论使用像 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/