2017-11-21 6 views
0

は、私は2つのシングルトンを使用して、このInversify円形シングルトン注入

import 'reflect-metadata'; 
import { Container, inject, injectable } from 'inversify'; 

let container = new Container(); 

@injectable() 
class Dom { 
    private domUi: DomUi; 

    constructor (domUi: DomUi) { 
    this.domUi = domUi; 
    } 
} 

@injectable() 
class DomUi { 
    private dom: Dom; 

    constructor (dom: Dom) { 
    this.dom = dom; 
    } 
} 

@injectable() 
class Test { 
    constructor (dom: Dom) { 
    console.log(dom); 
    } 
} 

container.bind<Dom>(Dom).toSelf().inSingletonScope(); 
container.bind<DomUi>(DomUi).toSelf().inSingletonScope(); 

const test = container.resolve(Test); 

のようにお互いを呼び出すためにそれらができるようにするためにしようとしている。しかし、それは、これは、固定することができますどのようにこのエラー

Error: Missing required @inject or @multiInject annotation in: argument 0 in class Dom. 

を与えますか? @inject@multiInjectを試してみました。
これはデザインパターンの観点から考えるより良い方法ですか?

答えて

1

私はあなたがバグを発見した、あなたは回避策として、以下を使用することができると思う:

import "reflect-metadata"; 
import { Container, inject, injectable } from "inversify"; 
import getDecorators from "inversify-inject-decorators"; 

let container = new Container(); 
let { lazyInject } = getDecorators(container); 

@injectable() 
class DomUi { 
    private _dom: Dom; 

    public constructor (dom: Dom) { 
     this._dom = dom; 
    } 
} 

@injectable() 
class Dom { 
    @lazyInject(DomUi) private domUi: DomUi; 
} 

@injectable() 
    class Test { 
    constructor(dom: Dom) { 
     console.log(dom); 
    } 
} 

container.bind<Dom>(Dom).toSelf().inSingletonScope(); 
container.bind<DomUi>(DomUi).toSelf().inSingletonScope(); 
const dom = container.resolve(Test); 

IDとして推奨実装は、シンボルではないクラスを次のようになります。

import "reflect-metadata"; 
import { Container, inject, injectable } from "inversify"; 
import getDecorators from "inversify-inject-decorators"; 

let container = new Container(); 
let { lazyInject } = getDecorators(container); 

const TYPE = { 
    Dom: Symbol("Dom"), 
    DomUi: Symbol("DomUi"), 
    Test: Symbol("Test") 
}; 

interface Dom {} 
interface DomUi {} 
interface Test {} 

@injectable() 
class DomUi { 
    public dom: Dom; 

    public constructor (
     @inject(TYPE.Dom) d: Dom 
    ) { 
     this.dom = d; 
    } 
} 

@injectable() 
class Dom { 
    @lazyInject(TYPE.DomUi) public domUi: DomUi; 
} 

@injectable() 
class Test { 
    constructor(
     @inject(TYPE.Dom) d: Dom 
    ) { 
     console.log(d, d.domUi.dom); 
    } 
} 

container.bind<Dom>(TYPE.Dom).to(Dom).inSingletonScope(); 
container.bind<DomUi>(TYPE.DomUi).to(DomUi).inSingletonScope(); 
container.bind<Test>(TYPE.Test).to(Test); 
const dom = container.get(TYPE.Test); 
+1

はありがとう、あなたソリューションが正しく機能しました!これは再現性のための工夫された例でしたが、私は実際のプロジェクトでシンボルを使用しています – UnLoCo

+1

このバグを追跡するためにGitHubで問題を作成しました。https://github.com/inversify/InversifyJS/issues/685 –

関連する問題