似乎至少有90%以上的我正在編寫的控制器操作需要訪問數據庫。對我來說,似乎是自動注入數據庫上下文的合理步驟。應該如何(以及如何如何)將數據庫上下文依賴注入到控制器中?
我從來沒有使用過依賴注入,所以我想確認這是一種模式。如果是這樣,我應該怎麼做呢?我知道ASP.NET MVC 3有「改進的依賴注入」支持,但是我仍然需要一個外部框架嗎?如果是這樣,什麼是默認值,我如何配置它爲每個http請求創建一個新的數據庫上下文?
似乎至少有90%以上的我正在編寫的控制器操作需要訪問數據庫。對我來說,似乎是自動注入數據庫上下文的合理步驟。應該如何(以及如何如何)將數據庫上下文依賴注入到控制器中?
我從來沒有使用過依賴注入,所以我想確認這是一種模式。如果是這樣,我應該怎麼做呢?我知道ASP.NET MVC 3有「改進的依賴注入」支持,但是我仍然需要一個外部框架嗎?如果是這樣,什麼是默認值,我如何配置它爲每個http請求創建一個新的數據庫上下文?
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框架構造器注入 - 最簡單的辦法是從DefaultControllerFactory派生。
一旦你有一個自定義IControllerFactory,您可以在Global.asax中這樣的寄存器:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());