2011-04-25 45 views
3

似乎至少有90%以上的我正在編寫的控制器操作需要訪問數據庫。對我來說,似乎是自動注入數據庫上下文的合理步驟。應該如何(以及如何如何)將數據庫上下文依賴注入到控制器中?

我從來沒有使用過依賴注入,所以我想確認這是一種模式。如果是這樣,我應該怎麼做呢?我知道ASP.NET MVC 3有「改進的依賴注入」支持,但是我仍然需要一個外部框架嗎?如果是這樣,什麼是默認值,我如何配置它爲每個http請求創建一個新的數據庫上下文?

回答

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框架構造器注入 - 最簡單的辦法是從DefaultControllerFactory派生。

一旦你有一個自定義IControllerFactory,您可以在Global.asax中這樣的寄存器:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 
相關問題