2015-06-17 18 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

相关问题