在我的ASP.NET MVC应用程序中,所有控制器都使用此ApplicationDbContext对象。此时它正在控制器构造函数中实例化,但这是紧耦合,并不是一个好习惯。
POST
理想情况下,我希望将这个ApplicationDbContext作为参数传递给每个控制器的构造函数,就像这个带依赖注入的场景一样:
public MessagesController()
{
this.Db = new ApplicationDbContext();
this.Mapper = new MessageMapper(Db);
this.Service = new MessageService();
}
问题是,如何实现这一目标?我试图找到控制控制器依赖注入的源代码,但它是.NET dll文件,我无法修改(就像你不能编辑系统命名空间文件)。那么ASP.NET MVC中的控制器如何实现依赖注入呢?任何人都可以使用我的场景作为例子吗?感谢。
答案 0 :(得分:1)
安装此软件包:
Install-Package Unity.Mvc5
在Application_Start()中添加以下行:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
UnityConfig.RegisterComponents(); // <----- Add this line
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
在UnityConfig中注册您的类型:
container.RegisterType<ApplicationDbContext>();
完成。
<强>更新强> 顺便说一句,通过这样做,您只需将创建新对象的代码移动到Unity。买你还在等具体课。此外,您将在控制器中拥有所有数据操作操作(读取:UI)。如果你真的想摆脱紧耦合,你可能想看看DAO模式。 http://en.wikipedia.org/wiki/Data_access_object
答案 1 :(得分:0)
我会告诉你我的方法。
关闭,您不希望DBContext直接暴露给控制器。事实上,要真正留下一些关注点,你不希望控制器甚至根本不知道DbContext
。
如果你告诉公司计划开始使用不同的存储技术,例如 RavenDB 或 MongoDB ,那么控制器的每一个都需要重构。 DbContext
不是必需的或有用的。
我不知道MessageMapper
类是什么,但确实需要一个DbContext
,这也会破坏。
您需要考虑采用存储库模式。
阅读这篇文章,它应该会有所帮助。