mvc 5应用程序可以开箱即用IoC吗?

时间:2015-06-17 22:27:48

标签: asp.net-mvc inversion-of-control

刚从模板中复制的新mvc 5应用程序如何将依赖项注入控制器?

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

您可以在刚刚创建的项目中的帐户控制器中看到这一点。

2 个答案:

答案 0 :(得分: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的选定答案中查看如何以这种方式执行此操作的示例)

答案 1 :(得分:1)

没有。我相信下一个版本将附带一个IOC容器,但MVC5不会