如何将 Structuremap 3 与对构造函数注入不友好的对象一起使用?
How do I use Structuremap 3 with objects that aren't friendly to constructor injection?
我正在从 StructureMap 2.x 移动到 3.x。一个主要变化是使用 ObjectFactory
会导致以下警告:
'StructureMap.ObjectFactory' is obsolete: 'ObjectFactory
will be removed in a future 4.0 release of StructureMap. Favor the
usage of the Container class for future
work'
所以在大多数情况下,解决方案相当简单:通过 IContainer
作为构造函数传递。不幸的是,这对于 ASMX 网络服务或属性来说是不可行的,它们都需要一个默认构造函数。这意味着我可能坚持 Service Locator Pattern, property injection, or writing my own ObjectFactory implementation.
处理这个不幸问题的首选方法是什么?
编辑:值得一提的是我的容器进行了程序集扫描。
我见过的最干净的处理方法是使用 .NET 路由来控制入口点,然后创建一个自定义 PageHandlerFactory
实现,将 DI 容器作为依赖项。
然后,自定义页面处理程序工厂将 属性 在 page/service 实例化之后但在调用其任何事件之前注入。
这几乎与 IControllerFactory
在 MVC 中使用 DI 的方式完全相同。在 MVC 中,容器在应用程序启动时被注入到自定义 IControllerFactory
实现中,这有效地使其成为应用程序组合根的一部分。在 ASP.NET 的情况下,IRouteHandler
实际上是合成根的一部分。
我无法找到 link 我最初看到该实现的来源。但是 this one 非常接近。主要区别在于尝试使用构造函数注入,但缺点是它需要完全信任才能执行。我相信如果你坚持 属性 注入,你可以在部分信任的情况下做到这一点。
Assembly scanning isn’t cheap and you (almost?) always wanna cache the
results. So, yeah, in that case you’re going to have to write your
own ObjectFactory. Someday all that bad old MS tech will go away.
所以在这种情况下,this implementation是应该做的。
我正在从 StructureMap 2.x 移动到 3.x。一个主要变化是使用 ObjectFactory
会导致以下警告:
'StructureMap.ObjectFactory' is obsolete: 'ObjectFactory will be removed in a future 4.0 release of StructureMap. Favor the usage of the Container class for future work'
所以在大多数情况下,解决方案相当简单:通过 IContainer
作为构造函数传递。不幸的是,这对于 ASMX 网络服务或属性来说是不可行的,它们都需要一个默认构造函数。这意味着我可能坚持 Service Locator Pattern, property injection, or writing my own ObjectFactory implementation.
处理这个不幸问题的首选方法是什么?
编辑:值得一提的是我的容器进行了程序集扫描。
我见过的最干净的处理方法是使用 .NET 路由来控制入口点,然后创建一个自定义 PageHandlerFactory
实现,将 DI 容器作为依赖项。
然后,自定义页面处理程序工厂将 属性 在 page/service 实例化之后但在调用其任何事件之前注入。
这几乎与 IControllerFactory
在 MVC 中使用 DI 的方式完全相同。在 MVC 中,容器在应用程序启动时被注入到自定义 IControllerFactory
实现中,这有效地使其成为应用程序组合根的一部分。在 ASP.NET 的情况下,IRouteHandler
实际上是合成根的一部分。
我无法找到 link 我最初看到该实现的来源。但是 this one 非常接近。主要区别在于尝试使用构造函数注入,但缺点是它需要完全信任才能执行。我相信如果你坚持 属性 注入,你可以在部分信任的情况下做到这一点。
Assembly scanning isn’t cheap and you (almost?) always wanna cache the results. So, yeah, in that case you’re going to have to write your own ObjectFactory. Someday all that bad old MS tech will go away.
所以在这种情况下,this implementation是应该做的。