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的選定答案中的這種方式的示例)
DependencyResolver的源代碼以及我在委託中使用的後備構造的基礎可在https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DependencyResolver中找到。 cs – smartcaveman
「通過這種方式,您可能不會從您的IoC配置中獲得任何實際價值」。不是每個人都會在這方面同意你的看法。有些人發現[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)是一個非常有價值的選擇。 – Steven
@Steven - 我確定你是對的 - 幾乎所有人都同意。偉大的博客,順便說一句 - 我的聲明實際上受到我從http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/學到的東西的影響 – smartcaveman