2016-11-23 100 views
1

我正在使用InversifyJS與TypeScript。工廠參數inversifyJS

比方說,我有注入和未注入的構造參數的混合物類:

@injectable() 
export class MyClass { 
    constructor(
     foo: Foo, // This thing isn't injectable 
     @inject(Bar) bar: Bar // This thing is 
    ){ 
     ... 
    } 
} 

我想這個類工廠注入到其它的類,然後用調用它第一個參數的值。

@injectable() 
export class SomeOtherClass { 
    constructor(
     @inject("Factory<MyClass>") myClassFactory: (foo: Foo) => MyClass 
    ){ 
     const someFoo = new Foo(); 
     const myClass = myClassFactory(someFoo); 
    } 
} 

我的問題:是有一些自動魔術Inversify,讓我注入這家工廠?

我來了這麼遠,最好是這樣的:

bind<interfaces.Factory<MyClass>>("Factory<MyClass>").toFactory(context => 
    (foo: Foo) => 
     new MyClass(foo, context.kernel.get<Bar>(Bar)) 
); 

但是,這意味着我明確new() -ing MyClassMyClass每一個新的可注射的依賴有太多在這裏添加。

有沒有更好的方法?也許是基於參數名稱Ninject Factory Extensions

回答

0

我是InversifyJS的作者。我不認爲在工廠內部使用new存在問題,請記住,工廠的工作是創建一個新的實例。

在工廠內多次撥打container.get<T>的確是not a good thing

我可以建議打破MyClass初始化進入到階段:

由工廠實例化的類:

@injectable() 
export class MyClass { 

    public c: C; // This thing isn't injectable 
    public d: D; // This thing isn't injectable 

    // PHASE 1: instantiation 
    constructor(
     @inject(A) a: A // This thing is 
     @inject(B) b: B // This thing is 
    ){ 
     ... 
    } 

    // PHASE 2: initialization 
    public init(c: C, d: D) { 
     this.c = c; 
     this.d = d; 
    } 

} 

使用工廠類:

@injectable() 
export class SomeOtherClass { 
    constructor(
     @inject("Factory<MyClass>") myClassFactory: (c: C, d: D) => MyClass 
    ){ 
     // you only use "new" with entities that are not injected by inversify 
     const c = new C(); 
     const d = new D(); 
     const myClass = myClassFactory(c, d); 
    } 
} 

而工廠:

bind<interfaces.Factory<MyClass>>("Factory<MyClass>").toFactory(context => 
    (c: C, d, D) => { 

     // PHASE 1: instantiation 
     let myClass = context.kernel.get<MyClass>("MyClass"); // a and b are injected 

     // PHASE 2: initialization 
     myClass.init(c, d); // c and d are initialized 

     return myClass; 

    } 
); 

我希望它有幫助,如果你認爲你知道更好的方法,請分享你對GitHub問題的想法。

+1

感謝您的支持。這絕對是一個必須「獲得」每個類的依賴關係的改進。也就是說,我可能會在GitHub上提出另一種方法。 –