#javascript #typescript #ecmascript-6 #inversifyjs
#javascript #typescript #ecmascript-6 #inversifyjs
Вопрос:
Я создаю библиотеку в TypeScript, которая использует систему внедрения зависимостей (InversifyJS) для создания самой себя и разрешения зависимостей внутри. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу предоставить несколько экземпляров из системы внедрения потребителям библиотеки.
В настоящее время я пытаюсь сделать:
import kernel from "./src/inversify.config";
import EntityManager from './src/manager/entityManager.service';
import StorageService from './src/storage/storage.service';
import LanguageService from './src/language/language.service';
export { kernel.get<EntityManager>(EntityManager) as EntityManagerInstance };
export { kernel.get<EntityManager>(LanguageService) as LanguageServiceInstance };
export { kernel.get<EntityManager>(StorageService) as StorageServiceInstance };
Решение, которое я вижу возможным, заключается в использовании фасада для экспорта типов и последующего доступа к ним:
import EntityManager from './src/manager/entityManager.service';
import StorageService from './src/storage/storage.service';
import LanguageService from './src/language/language.service';
import InjectionFacade from './utils/injection.facede';
export { EntityManager, LanguageService, StorageService, InjectiorFacade };
// Usage:
// import {InjectionFacade, StorageService} from 'entity-manager';
// let injectionFacade: InjectionFacade = InjectionFacade.createAndResolve();
// let storageService: StorageService = injectionFacade.getStorageService();
Но проблема в том, что у меня есть еще одна бесполезная абстракция
Есть ли способ реализовать такое решение без потери определений типов и экспорта готовых к использованию объектов?
Ответ №1:
Вы хотели бы использовать переменную с несколькими объявлениями, например
export const
EntityManagerInstance = kernel.get<EntityManager>(EntityManager),
LanguageServiceInstance = kernel.get<EntityManager>(LanguageService),
StorageServiceInstance = kernel.get<EntityManager>(StorageService);
Комментарии:
1. Спасибо — это то, что я хочу (к лучшему или к худшему)
2.Примечание:
kernel.get
многократный вызов является показателем возможного анти-шаблонаkernel.get
, который должен использоваться только один раз в корне вашей композиции