gpt4 book ai didi

asp.net-mvc-4 - 可以使用 CaSTLe Windsor 在 ASP.NET MVC 4 中实现 IDependencyResolver 吗?

转载 作者:行者123 更新时间:2023-12-04 14:14:11 25 4
gpt4 key购买 nike

我读了 this article看到很多人评论说不要使用 CaSTLe Windsor 在 ASP.NET MVC3 中实现 IDependencyResolver 并坚持使用自定义 IControllerFactory。基本上我现在的问题是:

  • 不要使用 CaSTLe Windsor 来实现 IDependencyResolver。这在 ASP.NET MVC 中是否仍然如此 4 ?
  • 如果 1 是这种情况。任何其他 DI 容器(Unity、StructureMap)是否有与 CaSTLe Windsor 相同的问题?我可以使用任何替代方法吗?

  • 非常感谢

    编辑

    在我看来,不应使用温莎城堡来实现 IDependencyResolver .我决定使用其他一些 DI 容器,例如 StructureMap

    最佳答案

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

    在我看来,迈克·哈德洛 (Mike Hadlow) 在这个问题上有点过于刻薄了,许多其他人在没有真正考虑原因的情况下就加入了这个潮流。

    是的,CaSTLe Windsor 确实有一个称为 Pooled 的特定对象生活方式(即生命周期管理对象),通常需要您对其调用 Release。并且在使用这种生活方式时,您可能不应该使用 IDependencyResolver,因为它不提供对此 Release 方法的访问(尽管也有解决方法)。

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

    为什么我认为 Hadlow 过于刻薄?好吧,因为他的整个论点都基于这一点:

    “没错,没有‘Release’方法。你可以从你的 IoC 容器中提供一个服务,但没有办法清理它。如果我要在 Suteki Shop 中使用它,我将会有一个史无前例的内存泄漏。 ”

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

    http://kozmic.net/2010/08/27/must-i-release-everything-when-using-windsor/

    请注意他在这里说的话:

    “正如我在上一篇文章中提到的,Windsor 将跟踪您的组件 ,这是用户 的常见误解,即为了正确释放所有组件,他们必须在容器上调用 Release 方法。”

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

    我知道我可能会因为其他人的争论而感到非常悲伤,但我根本不认为这是像哈德洛这样的人认为的世界末日问题,因为有太多的替代方案和解决方法,即使在你确实需要调用Release。

    除此之外,使用需要调用 Release 的生活方式对您(开发人员)来说意味着额外的工作。您现在必须管理对象生命周期并记住处理对象,否则会导致内存泄漏。在我看来,这基本上抵消了垃圾收集的好处。我只对不需要处理的东西使用 transient 对象,而且我从不使用池对象。

    顺便说一句,我可能是错的,但我认为任何其他容器都没有这个问题。这使我得出结论,是 Windsor 坏了,而不是 MVC,因为那里的每个其他容器似乎都没有这个问题。温莎喜欢固执地坚持它的现实版本,所以 YMMV。

    关于asp.net-mvc-4 - 可以使用 CaSTLe Windsor 在 ASP.NET MVC 4 中实现 IDependencyResolver 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18293840/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com