Asp.net mvc 4 Castle Windsor能否用于在ASP.NET MVC 4中实现IDependencyResolver?

Asp.net mvc 4 Castle Windsor能否用于在ASP.NET MVC 4中实现IDependencyResolver?,asp.net-mvc-4,dependency-injection,castle-windsor,Asp.net Mvc 4,Dependency Injection,Castle Windsor,我阅读并看到许多人评论说,不要使用Castle Windsor在ASP.NET MVC3中实现IDependencyResolver,而要坚持使用自定义IControllerFactory。基本上我现在的问题是: 不要使用Castle Windsor实现IDependencyResolver。在ASP.NET MVC4中仍然是这样吗 如果1是这样的话。任何其他DI容器(Unity、StructureMap)是否会遇到与Castle Windsor相同的问题?我能用别的吗 非常感谢 编辑 我觉得C

我阅读并看到许多人评论说,不要使用Castle Windsor在ASP.NET MVC3中实现IDependencyResolver,而要坚持使用自定义IControllerFactory。基本上我现在的问题是:

  • 不要使用Castle Windsor实现IDependencyResolver。在ASP.NET MVC4中仍然是这样吗

  • 如果1是这样的话。任何其他DI容器(Unity、StructureMap)是否会遇到与Castle Windsor相同的问题?我能用别的吗

  • 非常感谢

    编辑


    我觉得Castle Windsor不应该用于实现
    IDependencyResolver
    。我已经决定使用其他一些DI容器,比如StructureMap

    在IDependencyResolver方面,MVC3和MVC4没有区别,只是WebAPI有一个单独的解析器

    在我看来,迈克·哈德洛在这个问题上有点过于刻薄,而许多其他人在没有真正考虑原因的情况下就随波逐流

    是的,Castle Windsor确实有一个名为Poold的特定对象生活方式(即生命周期管理对象),它通常要求您对其调用Release。当使用这种生活方式时,您可能不应该使用IDependencyResolver,因为它不提供对这种发布方法的访问(尽管也有解决方法)

    但是,我觉得在web应用程序中使用这种生活方式通常是不好的,您应该改用PerWebRequest生活方式,它将在web请求结束时自动释放对象。如果这就是您正在使用的,那么将IDependencyResolver与Castle Windsor一起使用是没有问题的

    为什么我认为Hadlow太刻薄了?好吧,因为他整个论点都是基于这个:

    “是的,没有‘释放’方法。你可以从你的IoC容器中提供服务,但是没有办法清理它。如果我在Suteki商店中使用这个,我会有一个巨大的内存泄漏。”

    然后,他继续引用Krzysztof Koźmic关于生活方式管理的文章,但忽略了我将在这里介绍的后续文章:

    注意他在这里说的话:

    “正如我在之前的帖子中所说,Wind-sor将跟踪您的组件,这是用户的一个常见误解,即为了支持所有组件的发布,他们必须在容器上调用发布方法。”


    他还谈到了其他各个方面,但总的来说,我认为大多数人不会在web应用程序中使用需要处理的池对象或临时对象。如果您这样做了,那么您应该知道不要使用IDependencyResolver。否则,你应该没有问题

    我知道我可能会因为人们的不同观点而感到悲伤,但我并不认为这是哈德罗等人认为的世界末日问题,因为有太多的选择和解决办法,即使你确实需要称之为释放

    除此之外,使用一种需要调用Release的生活方式对开发人员来说意味着额外的工作。您现在必须管理对象的生命周期,并记住处置对象,否则会造成内存泄漏。在我看来,这从本质上否定了垃圾收集的好处。我只对不需要处理的东西使用临时对象,而从不使用池对象


    顺便说一句,我可能错了,但我不认为其他容器有这个问题。这让我得出结论,当其他所有容器似乎都没有问题时,是温莎而不是MVC被破坏了。温莎喜欢固执地坚持自己的现实版本,所以YMMV。

    建议不要使用
    IDependencyResolver
    ,因为它可以与Castle Windsor一起使用,即使界面缺少发布方法。解决方案只是让
    idependencysolver
    实现缓存每个请求的实例(例如,在绑定到web请求的缓存中,使用
    HttpContext.Items
    )。在web请求结束时,可以释放所有缓存实例(通常只有少数实例)

    为了能够在web请求结束时释放所有实例,您应该在global.asax中注册一个
    request\u Ends
    事件,或者注册一个执行此操作的
    HttpModule

    您可以将其称为一种变通方法,但不使用
    idependencysolver
    并不是一个真正的选项,因为它与MVC的集成太深了。此外,其他容器(如Ninject和Simple Injector)使用相同的方法(使用HttpModule)来“释放”实例

    不幸的是,目前还没有一个官方的NuGet软件包将Windsor与MVC进行整合,因为现在您必须自己实现这一点。顺便说一句,所有其他框架都有这样的包。但是,要自己实现这一点并不难


    其他IoC容器已经表明,可以将发布作为实现细节来实现,并且您不需要将发布作为
    idependencysolver
    合同的一部分。MVC设计人员实际上做了正确的事情,从API中删除了这种方法。

    尽管我同意实现IDependencyResolver是可能的,而且并不十分困难。。是的,根据游戏中的生活方式,明确地释放()可能并不重要。。。是的,有一些方法可以通过将实例缓存到某个地方以及其他微妙的技巧来强制发布()——我认为这需要很多解释,可能会有问题,也很难追踪。了解Windsor何时跟踪实例并不总是显而易见的(即,如果组件存在退役问题,与否、生活方式等)。核心增值之一