2015-06-17 51 views
2

剛剛從模板重新創建的新鮮mvc 5應用程序如何可能將注入依賴項注入到控制器中?mvc 5應用程序可以使用IoC嗎?

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager) 
    { 
     UserManager = userManager; 
     SignInManager = signInManager; 
    } 

這就是您可以在剛剛創建的項目中的帳戶控制器中看到的內容。

回答

3

ASP.NET MVC 5暴露多個注射點,使您描述的功能。

最明確的是DependencyResolver。默認的依賴關係解析器只是Activator.CreateInstance(controllerType),所以如果沒有選擇公共無參數的構造函數並且不會查找貪婪的構造函數,它會拋出一個錯誤。

但是,爲您的用例增強此行爲相當簡單。

在全局配置,添加:

DependencyResolver.SetResolver(
    type => { 
     if(type == typeof(AccountController)) 
     { 
      var userManager = /* resolve the ApplicationUserManager...*/ 
      var signInManager = /* resolve the ApplicationSignInManager...*/ 
      return new AccountController(userManager, signInManager); 
     } 
     else 
     { 
      return Activator.CreateInstance(type) 
     } 
    }, 
    type => Enumerable.Empty<object>() 
); 

該解決方案通過在代表而非IDependencyResolver實現,但你可以很容易地提供一個強類型的解析器來代替。

您可能不會從這種方式獲得您的IoC配置的任何實際價值,但應該指出,給定ASP.NET MVC 5框架完全有可能。最好的做法是引用NuGet包以將MVC 5與您的首選容器庫集成,然後讓它完成繁重的工作。我個人喜歡StructureMap(請查看this post的選定答案中的這種方式的示例)

+0

DependencyResolver的源代碼以及我在委託中使用的後備構造的基礎可在https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DependencyResolver中找到。 cs – smartcaveman

+1

「通過這種方式,您可能不會從您的IoC配置中獲得任何實際價值」。不是每個人都會在這方面同意你的看法。有些人發現[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)是一個非常有價值的選擇。 – Steven

+0

@Steven - 我確定你是對的 - 幾乎所有人都同意。偉大的博客,順便說一句 - 我的聲明實際上受到我從http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/學到的東西的影響 – smartcaveman

1

號,我相信下一版本將配備一個IOC容器,但MVC5不

+0

那麼它如何注入這種依賴關係? – doker

+1

他們不是。你會注意到模板中的AccountController也有一個默認的構造函數,當控制器被實例化時這個構造函數會被調用,並且2個屬性獲取器有空的合併操作符來解釋它們沒有被填充/注入。在兩個構造函數中設置斷點,然後單擊登錄或在標頭中註冊鏈接,您將看到只有默認的構造函數被擊中。 – dgavian

+0

哦,我明白了。謝謝! – doker

相關問題