2017-11-21 3 views
0

Ich versuche, zwei Singletons zu verwenden und sie in der Lage zu machen, sie zu nennen wie dieseInversify Kreis Singletons Injektion

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

Aber es gibt diesen Fehler

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

Wie dies behoben werden kann? Ich habe die @inject und @multiInject ohne Glück versucht!
Gibt es eine bessere Möglichkeit, dies vom Designmusterstandpunkt aus zu denken?

Antwort

1

Ich glaube, Sie einen Fehler gefunden haben, können Sie das folgende als Abhilfe verwenden:

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

Die empfohlene Implementierung mit Symbolen nicht Klassen als IDs wäre:

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

Danke, Ihr Lösung hat richtig funktioniert! Dies war ein künstliches Beispiel für Reproduzierbarkeit, aber ich werde Symbole in meinem aktuellen Projekt verwenden. – UnLoCo

+1

Ich habe ein Problem auf GitHub erstellt, um diesen Fehler zu verfolgen https://github.com/inversify/InversifyJS/issues/685 –