我开始在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??
});
答案 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();
}
}
可能有更好的方法,所以请大声疾呼。