设置工厂在编译时和运行时进行依赖项注入?

时间:2018-09-25 23:46:01

标签: java dependency-injection

我使用抽象工厂模式将运行时依赖项添加到对象图(该对象图是在程序启动时通过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在编译期间将对象留在上下文中为空。

0 个答案:

没有答案