如何将Structuremap 3与对构造函数注入不友好的对象一起使用?

时间:2015-03-13 21:24:45

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

我正在从StructureMap 2.x迁移到3.x.一个主要变化是使用ObjectFactory会产生以下警告:

  

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

因此在大多数情况下,分辨率相当简单:作为构造函数传递IContainer。不幸的是,这对于ASMX Web服务或属性来说是不可行的,这两者都需要默认的构造函数。这意味着我可能会遇到Service Locator Pattern,属性注入或writing my own ObjectFactory implementation

处理这个不幸的问题的首选方法是什么?

编辑:值得一提的是我的容器会进行装配扫描。

2 个答案:

答案 0 :(得分:2)

Per Jeremy Miller, himself

  

装配扫描并不便宜,你(几乎?)总是想缓存   结果。所以,是的,在那种情况下,你将不得不写你的   自己的ObjectFactory。总有一天,那些糟糕的旧MS技术将会消失。

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

答案 1 :(得分:1)

我看到处理这个问题的最简单方法是使用.NET路由来控制入口点,然后创建一个自定义PageHandlerFactory实现,将DI容器作为依赖项。

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

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

我无法找到我最初看到该实现的源的链接。但this one非常接近。主要的区别是人们试图使用构造函数注入,但缺点是它需要完全信任。我相信如果你坚持使用属性注入,你可以部分信任。