Как внедрить зависимости внутри класса - PullRequest
1 голос
/ 03 мая 2020

У меня есть 2 услуги. CarsController и CarsFetcherService

У меня также есть класс с именем Car.

. В CarsController есть метод createCar(), который создает экземпляр Car при каждом его вызове. Каждый экземпляр Car должен быть снабжен службой CarsController.

С приведенным ниже кодом каждый экземпляр Car получает неопределенное значение вместо зависимости CarsController. Я использую библиотеку typedi, чтобы проиллюстрировать проблему, которую я хочу знать в целом, как это делается. Также будет полезен ответ с другой библиотечной ссылкой inversify или Nest js или даже Angular.

export class Car {
    @Inject() // this is not working here
    private carsController: CarsController; // this becomes undefined
    private carRecipe: string;

    constructor(carRecipe: string) {
        this.carRecipe = carRecipe;
        this.carsController.notifyNetwork('HelloWorld, I am created!');
    }
}

@Service()
export class CarsController {

    @Inject()
    private carsNetworkService: CarsFetcherService;
    private cars: Car[] = [];

    constructor() {
    }

    createCar() {
        const carRecipe = this.carsNetworkService.getRequestSomething();
        const car = new Car(carRecipe);
        this.cars.push(car);
    }

    notifyNetwork(msg: string) {
        this.carsNetworkService.postRequestSomething(msg);
    }
}

@Service()
export class CarsFetcherService {
    getRequestSomething() {
        return 'this is how to make a car';
    }

    postRequestSomething(msg:string) {
        console.log(msg)
    }
}

const carsController = Container.get(CarsController)
// Creating 4 cars
carsController.createCar()
carsController.createCar()
carsController.createCar()
carsController.createCar()

1 Ответ

0 голосов
/ 03 мая 2020

Я думаю, что при использовании typedi и других подобных DI-сред вы должны разделить свои классы на две категории. Первыми категориями будут сервисы: typedi будет гарантировать, что существует только один экземпляр каждого, typedi будет создавать эти экземпляры и внедрять все. Вторая категория - это обычные объекты, которые вы создаете и управляете сами.

Итак, если вы хотите создать столько экземпляров Car, сколько хотите, не используйте для этого DI - вы уже создайте его в сервисе, который имеет прямые ссылки на все, что нужно Car:

export class Car {
    // deleted inject decorator

    constructor(private carsController, private carRecipe: string) {
        this.carsController.notifyNetwork('HelloWorld, I am created!');
    }
}

@Service()
export class CarsController {

    @Inject()
    private carsNetworkService: CarsFetcherService;
    private cars: Car[] = [];

    constructor() {
    }

    createCar() {
        const carRecipe = this.carsNetworkService.getRequestSomething();
        const car = new Car(this, carRecipe);
        this.cars.push(car);
    }

    notifyNetwork(msg: string) {
        this.carsNetworkService.postRequestSomething(msg);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...