InversifyJS 中带有参数的工厂
Factory with parameters in InversifyJS
我正在使用 InversifyJS 和 TypeScript。
假设我有一个 class,它混合了注入和非注入的构造函数参数:
@injectable()
export class MyClass {
constructor(
foo: Foo, // This thing isn't injectable
@inject(Bar) bar: Bar // This thing is
){
...
}
}
我想将此 class 的工厂注入到其他 class 中,然后使用第一个参数的值调用它。
@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 MyClass
并且 MyClass
的每个新的可注入依赖项也必须添加到这里。
有没有更好的方法?也许是基于参数名称的东西,例如 Ninject Factory Extensions?
我是 InversifyJS 的作者。我认为在工厂内部使用 new
没有问题,记住工厂的工作是创建一个 new 实例。
在工厂内部多次调用container.get<T>
确实是not a good thing。
我建议将 MyClass
的初始化分为几个阶段:
工厂实例化的class:
@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;
}
}
使用工厂的class:
@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 问题的想法。
我正在使用 InversifyJS 和 TypeScript。
假设我有一个 class,它混合了注入和非注入的构造函数参数:
@injectable()
export class MyClass {
constructor(
foo: Foo, // This thing isn't injectable
@inject(Bar) bar: Bar // This thing is
){
...
}
}
我想将此 class 的工厂注入到其他 class 中,然后使用第一个参数的值调用它。
@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 MyClass
并且 MyClass
的每个新的可注入依赖项也必须添加到这里。
有没有更好的方法?也许是基于参数名称的东西,例如 Ninject Factory Extensions?
我是 InversifyJS 的作者。我认为在工厂内部使用 new
没有问题,记住工厂的工作是创建一个 new 实例。
在工厂内部多次调用container.get<T>
确实是not a good thing。
我建议将 MyClass
的初始化分为几个阶段:
工厂实例化的class:
@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;
}
}
使用工厂的class:
@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 问题的想法。