Настройка фабрики для внедрения зависимостей во время компиляции и во время выполнения? - PullRequest
0 голосов
/ 26 сентября 2018

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

Единственное решение, которое я до сих пор нашел, - это ввести какой-то объект контекста и заполнить этот объект контекста данными времени выполнения.Но это также приводит к тому, что временная связь оставляет объект внутри контекста нулевым во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...