繁体   English   中英

逆转正确的方式来注入对许多域类的依赖

[英]Inversify correct way to inject dependencies on many domain classes

我在弄清楚如何处理使用打字稿制作的其余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容器中,因此我可以在应用程序之后检索它们。

解决此问题的最佳方法是什么?

我终于通过在运行时装饰每个类解决了它:

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);
    }
}

这样,我避免依赖特定的注入技术来处理任何领域类,从而使它们保持干净。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM