【问题标题】:How do I use Structuremap 3 with objects that aren't friendly to constructor injection?如何将 Structuremap 3 与对构造函数注入不友好的对象一起使用?
【发布时间】:2015-03-13 21:24:44
【问题描述】:

我正在从 StructureMap 2.x 迁移到 3.x。一个重大变化是使用ObjectFactory 会导致以下警告:

'StructureMap.ObjectFactory' 已过时:'ObjectFactory 将在 StructureMap 的未来 4.0 版本中删除。赞成 将来使用 Container 类 工作”

所以在大多数情况下,解决方法相当简单:将IContainer 作为构造函数传递。不幸的是,这对于 ASMX Web 服务或属性是不可行的,它们都需要默认构造函数。这意味着我可能会被Service Locator Pattern、属性注入或writing my own ObjectFactory implementation 卡住。

解决这个不幸问题的首选方法是什么?

编辑:值得一提的是,我的容器进行了组装扫描。

【问题讨论】:

    标签: c# dependency-injection ioc-container structuremap structuremap3


    【解决方案1】:

    Per Jeremy Miller, himself:

    程序集扫描并不便宜,而且您(几乎?)总是想缓存 结果。所以,是的,在这种情况下,你将不得不写你的 自己的对象工厂。总有一天,所有糟糕的旧 MS 技术都会消失。

    所以在这种情况下,this implementation 是应该做的。

    【讨论】:

    • 感谢您回来分享答案,我经常想知道 Jeremy Miller 在这方面的立场。
    【解决方案2】:

    我见过的最简洁的处理方法是使用 .NET 路由来控制入口点,然后制作一个将 DI 容器作为依赖项的自定义 PageHandlerFactory 实现。

    然后,自定义页面处理程序工厂将在页面/服务被实例化之后但在其任何事件被调用之前对其进行属性注入。

    这与 IControllerFactory 在 MVC 中与 DI 的工作方式几乎完全相同。在 MVC 中,容器在应用程序启动时被注入到自定义的IControllerFactory 实现中,这有效地使其成为应用程序组合根的一部分。对于 ASP.NET,IRouteHandler 将有效地成为组合根的一部分。

    我找不到指向最初看到该实现的源的链接。但是this one 非常接近。主要区别在于尝试使用构造函数注入,但缺点是它需要完全信任才能做到。我相信如果你坚持使用属性注入,你可以在部分信任的情况下做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 2011-01-16
      • 2016-11-19
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多