我试图弄清楚在使用依赖注入(inject)时如何创建多个对象。据我了解,标准方法是注入(inject)一个工厂,然后用于创建对象。我挣扎的部分是工厂如何创建对象。到目前为止,我看到了两种可能的解决方案:
工厂只是使用 new() 来创建对象。
使用容器作为服务定位器
感觉就像我可以在一个糟糕的解决方案和一个糟糕的解决方案之间徘徊。我有什么遗漏或者我在这里理解错了吗?
编辑 目前我根本没有使用 Ioc,而是在考虑 Ninject。尽管 Autofac DelegateFactories 听起来很有希望。
最佳答案
对于初学者,我不认为在工厂中使用容器作为服务定位器是一种反模式。在真正的情况下,它是完全合适的。想一想,容器感知工厂实际上是容器扩展,而那些似乎被排除在服务定位器抨击之外。即使是最纯粹的 IoC 框架,如 AutoFac 或 Ninject,也具有广泛的扩展能力。这种模式最典型的用例是根据使用服务的位置解析不同的实现。
关于使用 new
在工厂内部创建实例,这也是可以接受的。那里的 IoC/DI 消息有点失真,从不使用 new
确实是副作用,而不是 DI 的目标。依赖注入(inject)的首要任务是将组件的依赖创建外部化。只要工厂本身被注入(inject)到组件中,它就可以满足这一要求。在评估此类场景时,您需要问自己的问题是:
我之前说过,IoC 容器只是类固醇的工厂。对于 80% 的用例,它们开箱即用。其他 20% 可能需要对上述两个品种进行调整。当我想创建既需要注册依赖项又需要一些运行时输入和
new
的组件时,我倾向于使用容器感知工厂。 - 当我创建不依赖于其他服务但在运行时获取所有构造参数的域对象时创建工厂。
关于dependency-injection - 使用依赖注入(inject)时使用工厂创建多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276853/