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

Can mvc 5 application has IoC out of the box?

刚刚从模板重新生成的新 mvc 5 应用程序怎么可能将依赖项注入到控制器中?

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

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

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

ASP.NET MVC 5 公开了多个注入点,可实现您描述的功能。

最明确的是DependencyResolver。默认依赖解析器只执行 Activator.CreateInstance(controllerType),因此如果没有选择 public 无参数构造函数,它将抛出错误,并且不会寻找贪婪的构造函数。

但是,为您的用例增强此行为相当简单。

在您的全局配置中,添加:

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