InversifyJS - 注入对象的特定实例

InversifyJS - Inject a specif instance of an object

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

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

如您所想,当事件发生时,Dynamics 365 将调用 onLoad 函数。表单上下文(本例中的 ExternalContext)将作为参数传递给函数。这个对象非常重要,因为它允许我们的代码与表单中存在的控件进行交互,正是这个对象,我想注入到 BusinessLogic class .

业务逻辑class:

@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...
    }
}

我如何register/inject将平台传递给我的onLoad方法的ExternalContext对象进入我的业务class?我考虑将其存储在容器上下文中,但我确信有更好的方法。

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

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

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

可能有更好的方法,所以如果你能想出办法,请大声说出来。