我使用抽象工厂模式将运行时依赖项添加到对象图(该对象图是在程序启动时通过DI框架创建的)。目前,我的工厂存储了我在编译时拥有的所有依赖项。不,我想在运行时通过init()方法添加一些依赖项。在我的DI容器中,我可以在程序周围分布工厂,并通过调用Factory#create()
获取对象。
好吧,我可以在运行时传递运行时参数(例如,像Factory#create(String someString)
以避免泄漏抽象),但是我只想使用运行时参数来完成工厂的“设置”,这样我就可以该对象而无需再次提供任何运行时参数?
下面是一个简单的示例:
public class CarFactory {
//can be injected at compile-time through DI container
Wheel wheel;
Light light;
public Car create(String carName) {
return new Car(carName, this.wheel, this.light);
}
}
在代码[CodePosition1]的某个点上(只有那里!),我将获得运行时参数,该参数可用于最终构建汽车:
public class SomeClass {
CarFactory cf;
...
//thanks to the factory I can combine injectables and runtime params
Car car = cf.create("bmw");
...
}
但是我也想在其他地方使用该新创建的汽车,例如在完全不同的[CodePosition2]:
public class CarConsumer() {
CarFactory carFactory;
...
//I want to get the car that same car I build at [CodePosition1] with
//something like the following as I don't have the runtime parameter here
Car car = carFactory.getCar();
...
}
问题是,从[CodePosition1]“存储”新车以在代码中其他位置使用它的正确位置在哪里?在[CodePosition2]中还是仅提供如何通过DI容器提供仍在全局范围内在运行时创建的依赖项?工厂只允许我创建一个可以提供运行时信息的对象。
到目前为止,我提出的唯一解决方案是注入某种上下文对象,并用运行时数据填充该上下文对象。但这也会导致temporal coupling在编译期间将对象留在上下文中为空。