簡體   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