阅读了Mark Seemann 的博客文章以及引用它的响应后,我理解了使用服务定位器模式而不是通过类构造函数进行依赖注入的缺点。我还阅读了这个Dependency Injection with Ninject, MVC 3 和使用服务定位器模式,它也讨论了这个问题。
但是,我的问题涉及这种特殊情况:
public class MyController
{
public void GetData()
{
using (var repository = new Repository())
{
// Use the repository which disposes of an Entity Framework
// data context at the end of its life.
}
}
// Lots of other methods.
}
在这里,我有一个控制器,其中包含一个调用存储库的方法,该存储库自动实例化内部实体框架数据上下文。使用这个单一数据上下文,因为该上下文被存储库中的每个方法调用,因此在存储库对象的整个生命周期共享单个上下文似乎是有意义的。
现在,由于控制器类很大,所以这个给定的存储库不会被使用的可能性更大。正如我假设(可能是错误的)这种实例化 DC 是一项昂贵的操作,我宁愿避免这样做。使用服务定位器模式允许我将实例化推迟到实际需要上下文时,但鉴于上述链接中反对它的有效参数,我宁愿避免它。
所以我想知道的是,在上述情况下是否有一种更有效的方式来使用依赖注入,这会阻止我不必要地实例化我的存储库和底层数据上下文。