2012-09-12 69 views
0

我有一個架構,其中所有的默認依賴關係都通過InitializeOnActionExecuting自動注入。這一切都像一個魅力,因爲在運行時(而不是測試),默認控制器激活器將調用這些方法傳遞正確的具體對象。精細。在ASP.NET MVC控制器中注入我自己的自定義依賴關係的正確方法是什麼?

我的問題開始於我在InitializeOnActionExecuting方法中有一個自定義依賴項不可注入時。

例:

public class MyController 
{ 
    private IEmailSender emailSender = null; 
} 

嗯..在運行時emailSender將是無效的,除非我把它設置爲別的東西。在這種情況下,我想最終的東西沒有那麼大,像這樣:

public class MyController 
{ 
    private IEmailSender emailSender = null; 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     if(this.emailSender == null) 
       this.emailSender = new SomeConcreteEmailSender(); 
    } 
} 

難看。我不想這樣做「如果空,實例化」的東西。

更sofisticated方式注入IEmailSender會創造我自己的ControllerActivator,只會在運行時調用(未測試),並且將沒有必要做這個「如果」自動注入IEmailSender。但我不想爲每個需要注入的控制器創建自定義ControllerActivator

這就是說,當涉及到ASP.NET控制器的自定義依賴注入時,什麼被視爲標準?

+1

「什麼是標準的,當談到自定義」 - 也許你可以看看使用標準的依賴注入框架? – Slugart

回答

3

這就是說,什麼是自定義 ASP.NET控制器的依賴注入標準?

構造方法注入:

public class MyController: Controller 
{ 
    private readonly IEmailSender _emailSender; 

    public MyController(IEmailSender emailSender) 
    { 
     _emailSender = emailSender; 
    } 

    ... actions using the _emailSender here ... 
} 

這裏還有什麼視爲差,man's-依賴注入(請不要使用),對於不希望使用現有的依賴注入框架的人(因爲例如他們在一些公司工作,一些技術上不識字的白癡決定應該使用哪些框架以及哪些不適用)或者懶得編寫自定義的依賴關係解析器:

public class MyController: Controller 
{ 
    private readonly IEmailSender _emailSender; 

    public MyController(): this(new SomeConcreteEmailSender()) 
    { 
    } 

    public MyController(IEmailSender emailSender) 
    { 
     _emailSender = emailSender; 
    } 

    ... actions using the _emailSender here ... 
} 
+0

默認的ControllerActivator不會調用我的自定義構造函數,並且不會讓我處理我想要的「if」 –

+1

這就是爲什麼您可以編寫自定義構造函數的原因。或者,如果你不想重新發明輪子,你可以使用現有的依賴注入框架。例如Ninject非常漂亮。所有你需要做的就是安裝'Ninject.MVC3' NuGet包,然後在你創建的'AppStart'文件夾中註冊你的依賴項。 Ninject會爲您註冊一個自定義[依賴解析器](http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html),以便您可以在應用程序的許多位置注入依賴項如控制器。 –

+0

Ninject可能是一個很好的解決方案 –

相關問題