Я использую абстрактный шаблон фабрики, чтобы добавить зависимости времени выполнения к моему графу объектов (который был создан при запуске программы через структуру 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?Фабрика позволяет мне только создать объект, в который я могу предоставить информацию времени выполнения.
Единственное решение, которое я до сих пор нашел, - это ввести какой-то объект контекста и заполнить этот объект контекста данными времени выполнения.Но это также приводит к тому, что временная связь оставляет объект внутри контекста нулевым во время компиляции.