我在弄清楚如何处理用打字稿制作的其余Web服务上的依赖关系和注入时遇到麻烦。 我试图避免依赖于依赖反转原理的域类逆转。到目前为止,这是项目结构:
core/ (domain classes)
expressjs/ (web service context)
inversify/ (the injection magic for my domain classes should happen here)
other-modules/ (concrete interface implementations on 3rd party techs)
这是我的班级样子的一个例子:
interface DomainInterface {
foo(): void;
}
interface DomainService {
bar();
}
class ConcreteClass implements DomainInterface {
constructor(colaborator: DomainService) { }
foo() {
this.colaborator.bar();
...
}
}
现在,我想通过inverseify注入所有依赖项,但是我不想修改我的所有域类,以使其通过@injectable装饰器将其注入。
我做的一件事是在一个类中包含了对inversify模块的@injectable依赖,该模块继承了我需要注入的每个域类。例如:
@injectable()
class InverisfyConcreteClass extends ConcreteClass {
constructor(@inject(DomainService) colaborator: DomainService) {
super(colaborator);
}
}
但是,这导致我遇到一个问题,即我有很多域类,并且创建这么多个类会很疯狂。
另一种方法是创建一个“上下文”类,其中包含对所有类的引用,将它们绑定到容器上,并在需要时检索它们:
class InversifyInjectionContext {
container: Container;
bind() {
// bind all needed instances somehow (??)
}
concreteClass() {
return container.get<ConcreteClass>();
}
concreteDomainService() {
return container.get<AnyConcreteDomainService>();
}
}
现在的问题是,我无法弄清楚如何创建实例并将其正确注册到inverseify容器中,因此我可以在应用程序之后检索它们。
解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
我终于通过在运行时装饰每个类来解决它:
InversifyContext {
container: Container;
bindConcreteClass() {
decorate(injectable(), InverisfyConcreteClass);
decorate(inject("ColaboratorDomainService"), InverisfyConcreteClass, 0);
this.container.bind("InverisfyConcreteClass").to(DomainInterface);
}
bindColaboratorDomainService() {
decorate(injectable(), ColaboratorDomainService);
this.container.bind("ColaboratorDomainService").to(DomainService);
}
}
这样,我避免对任何领域类都依赖特定的注入技术,从而使它们变得干净。