我通常尝试使用依赖注入框架来使用构造函数注入,并避免将Container注入我的类。但是,我需要为消息处理器创建多个实例(每个处理线程一个),因此我无法使用构造函数注入来实例化这些处理器。
当然我可以注入容器并使用它来解析处理器,但是很多人说这是反模式。我也可以为他们创建一个工厂,解决工厂问题,然后用它来构建处理器。但是我必须为每种类型都有一个单独的工厂我想要注入,即使没有正确构造类型所需的参数,似乎需要大量的开销,所以我倾向于只注入容器而不是那样......其他人是否有关于处理这种情况的最佳方法的想法?
非常感谢您的协助!
答案 0 :(得分:0)
您所指的反模式称为Service Locator。容器的依赖性是否是服务位置的一种形式取决于您使用它的位置。这是因为服务定位器约为the role, not about the mechanics。因此,您可以自由地将容器用于Composition Root内的所有代码。
虽然可以随意使用容器为您创建实例,但通常bad to have application-accessible factory abstractions创建组件,因为:
服务抽象不应在其定义中公开其他服务抽象
相反,如果需要动态创建此类消息处理器,则这不是消费者关注的问题;创建额外的抽象只会使代码复杂化。因此,您希望为消息处理器(在组合根中定义)创建一个代理实现,该实现在运行时调用回容器以为您创建瞬态消息处理器实现。您将该代理注入到消费者而不是真实的消息处理器中,并且由于代理和真实处理器都实现了相同的接口,因此消费者不知道这一点。