InversifyJS-注入对象的指定实例

时间:2019-06-12 13:19:27

标签: javascript typescript inversifyjs

我开始在Dynamics 365开发中使用InversifyJS。为了给您一些环境,Dynamics允许您扩展平台来编写自定义业务逻辑(使用JS)并将其附加到已定义的表单事件。在此示例中,我想实例化我的业务逻辑类并在表单onload事件上执行我的自定义代码。代码应如下所示:

namespace Example {
    export function onLoad(context: ExternalContext) {
        set bl = container.resolve<BusinessLogic>(BusinessLogic);
        bl.doSomething();
    }
}

您可以想象,事件发生时,Dynamics 365将调用onLoad函数。表单上下文(在此示例中为ExternalContext)将作为参数传递给函数。该对象非常重要,因为它允许我们的代码与表单中存在的控件进行交互,并且正是我要向BusinessLogic类注入的对象。< / p>

BusinessLogic类:

@injectable()
export class BusinessLogic {
    protected readonly _context: ExternalContext;
    protected readonly _otherDependency: OtherDependency;

 constructor(
    @inject(ExternalContext) formContext: ExternalContext, 
    @inject(OtherDependency) otherDependency: OtherDependency) {
    this._formContext = formContext;
    this._otherDependency = otherDependency;
}

doSomething() {
    this._otherDependency.foo(this._context.value1);
}
}

另一个依赖示例:

@injectable()
export class OtherDependency {
    foo(propertyValue: string) {
        // do stuff...
    }
}

如何将平台传递给我的ExternalContext方法的onLoad对象注册/注入到我的业务类中?我考虑过将其存储在容器上下文中,但是我敢肯定有更好的方法。

container.bind<ExternalContext>().toDynamicValue((context) => {
   //context??
});

1 个答案:

答案 0 :(得分:0)

以防万一其他人遇到这种情况,我已经实现了将容器包装在带有私有变量的类中,可以在其中存储我的ExternalContext并使用toDynamicValue()进行绑定(我不能找不到为此使用容器上下文的方法。

    this.container.bind<ExternalContext>(ExternalContext).toDynamicValue(() => {
        return this._externalContext;
    });

我不喜欢这种方法的一点是,需要在使用容器之前手动设置上下文,但是考虑到替代方法,我认为这还不错:

namespace Example {
    export function onLoad(context: ExternalContext) {
    externalContainer.setContext(context);  // <----- :(       
    set bl = externalContainer.container.resolve<BusinessLogic>(BusinessLogic);
            bl.doSomething();
        }
    }

可能有更好的方法,所以请大声疾呼。