如何将ApplicationDbContext传递给ASP.NET MVC5构造函数?

时间:2015-05-26 18:25:01

标签: c# asp.net asp.net-mvc dependency-injection asp.net-mvc-5

在我的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中的控制器如何实现依赖注入呢?任何人都可以使用我的场景作为例子吗?感谢。

2 个答案:

答案 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,这也会破坏。

您需要考虑采用存储库模式

阅读这篇文章,它应该会有所帮助。

http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application