似乎至少有90%以上的控制器操作需要访问数据库。对我来说,自动注入数据库上下文似乎是一个合乎逻辑的步骤。
之前我从未使用过依赖注入,因此我想确认这是一种模式。如果是的话,我该怎么做呢?我知道ASP.NET MVC 3有“改进的依赖注入”支持,但我还需要一个外部框架吗?如果是,那么什么是默认值?如何配置它以根据http请求创建新的数据库上下文?
答案 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());