【发布时间】:2015-06-03 20:03:01
【问题描述】:
在我的 ASP.NET MVC 应用程序中,所有控制器都使用这个 ApplicationDbContext 对象。目前它正在控制器构造函数中实例化,但这是紧密耦合的,不是一个好的做法。
public MessagesController()
{
this.Db = new ApplicationDbContext();
this.Mapper = new MessageMapper(Db);
this.Service = new MessageService();
}
理想情况下,我希望将此 ApplicationDbContext 作为参数传递给每个控制器的构造函数,就像这种依赖注入的场景:
public MessagesController(ApplicationDbContext context){
this.Db = context;
this.Mapper = new MessageMapper(Db);
this.Service = new MessageService();
}
问题是,如何做到这一点?我试图找到控制控制器依赖注入的源代码,但它以 .NET dll 文件的形式出现,我无法修改(就像您无法编辑系统命名空间文件一样)。那么,ASP.NET MVC 中的控制器如何进行依赖注入呢?谁能以我的场景为例?谢谢。
【问题讨论】:
-
有许多带有 MVC 适配器的 IoC 框架。请参阅 asp.net/mvc/overview/older-versions/hands-on-labs/… 了解 Unity
-
实际上您也想将服务作为依赖项传递。如果 Mapper 实际上是一个 Repository,那么它应该被注入而不是 ApplicationDbContext,它是一个 persistence detail。顺便说一句,正确使用 DI 意味着您只向构造函数注入您需要的服务(存储库也是一种服务),而不是自己做事所需的所有依赖项。
-
感谢您的建议。我还想知道,如果我想将 Controller.Server 之类的东西注入到一个名为 ImageUploadService 的类中,我该怎么做?问题是 Controller.Server 在控制器的构造函数中不可用,而仅在控制器操作中可用。我想确保作为依赖项传递的 Controller.Server 始终是同一个实例。
标签: c# asp.net asp.net-mvc dependency-injection asp.net-mvc-5