应该(如果是这样的话)应该如何将数据库上下文注入控制器?

时间:2011-04-25 16:11:17

标签: asp.net-mvc-3 dependency-injection

似乎至少有90%以上的控制器操作需要访问数据库。对我来说,自动注入数据库上下文似乎是一个合乎逻辑的步骤。

之前我从未使用过依赖注入,因此我想确认这是一种模式。如果是的话,我该怎么做呢?我知道ASP.NET MVC 3有“改进的依赖注入”支持,但我还需要一个外部框架吗?如果是,那么什么是默认值?如何配置它以根据http请求创建新的数据库上下文?

1 个答案:

答案 0 :(得分:1)

ASP.NET MVC 3没有改进的DI支持 - 它改进了对Service Locator anti-pattern的支持(图)。幸运的是,自从MVC 1通过IControllerFactory接口以来,它已经支持DI。

回答这个问题,是的,将Repository注入控制器听起来是完全正常的事情(尽管我们通常会在两者之间滑动域模型)。

最好使用构造函数注入,如下所示:

public class MyController
{
    private readonly IMyRepository repository;

    public MyController(IMyRepository repository)
    {
        if (repository == null)
        {
            throw new ArgumentNullException("repository");
        }

        this.repository = repository;
    }

    public ViewResult MyAction(int barId)
    {
        var bar = this.repository.SelectBar(barId);
        return this.View(bar);
    }
}

您需要提供一个自定义IControllerFactory来启用带有MVC框架的Constructor Injection - 最简单的方法是从DefaultControllerFactory派生。

一旦有了自定义IControllerFactory,就可以在Global.asax中注册它,如下所示:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());