【问题标题】:Can mvc 5 application has IoC out of the box?mvc 5 应用程序可以开箱即用 IoC 吗?
【发布时间】:2015-06-17 22:27:48
【问题描述】:

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

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

这是您可以在刚刚创建的项目中的 Account Controller 中看到的内容。

【问题讨论】:

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


    【解决方案1】:

    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 的源代码和我在委托中使用的后备构造的基础可在 github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/… 获得
    • “通过这种方式进行 IoC 配置,您可能不会获得任何真正的价值”。不是每个人都会同意你的观点。有些人认为Pure DI 是一个非常有价值的选择。
    • @Steven - 我相信你是对的 - 每个人都同意的事情很少。很棒的博客,顺便说一句 - 我的陈述实际上受到了我从 blog.ploeh.dk/2012/11/06/WhentouseaDIContainer 学到的东西的影响
    【解决方案2】:

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

    【讨论】:

    • 那么它是如何注入这个依赖的呢?
    • 他们不是。您会注意到模板中的 AccountController 也有一个默认构造函数,这是在实例化控制器时将被调用的构造函数,并且 2 个属性获取器具有空合并运算符来说明它们没有被填充/注入。在两个构造函数中都设置断点,然后在头部点击登录或注册链接,你会看到只有默认构造函数被命中。
    • 哦,我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 2013-12-21
    • 2015-10-13
    • 2020-09-27
    • 2016-07-17
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多