Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 反转在许多域类上注入依赖项的正确方法_Typescript_Inversifyjs - Fatal编程技术网

Typescript 反转在许多域类上注入依赖项的正确方法

Typescript 反转在许多域类上注入依赖项的正确方法,typescript,inversifyjs,Typescript,Inversifyjs,我很难弄清楚如何处理用typescript创建的RESTWeb服务上的依赖项和注入。 我正试图避免遵循依赖倒置原则,在我的域类上依赖inversify。这是迄今为止的项目结构: core/ (domain classes) expressjs/ (web service context) inversify/ (the injection magic for my domain classes should happen here) other-modules/ (concrete interf

我很难弄清楚如何处理用typescript创建的RESTWeb服务上的依赖项和注入。 我正试图避免遵循依赖倒置原则,在我的域类上依赖inversify。这是迄今为止的项目结构:

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();
        ...
    }
}
现在我想通过inversify注入所有依赖项,但我不想修改所有域类,使它们通过@injectable decorator可注入

我想做的一件事是创建一个类,该类包含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>();
    }
}
类InversifyInjectionContext{
容器:容器;
绑定(){
//以某种方式绑定所有需要的实例(?)
}
混凝土类(){
return container.get();
}
concreteDomainService(){
return container.get();
}
}
现在的问题是,我不知道如何创建实例并在inversify容器中正确注册它们,以便在应用程序中检索它们


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

我最终通过在运行时装饰每个类来解决这个问题:

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

通过这种方式,我避免了对任何域类依赖特定的注入技术,从而使它们保持干净。

这很好。。。但是事实上,我必须定义
decoration(inject(“ColaboratorDomainService”),InverisfyConcreteClass,0)违背了国际奥委会自动为我连接一切的目的。在这一点上,我也可以把所有的类都打印出来,然后重新创建它们,然后自己连接它们,而不需要任何注入技术。