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();
}
}
可能有更好的方法,所以如果你能想出办法,请大声说出来。
我开始在 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();
}
}
可能有更好的方法,所以如果你能想出办法,请大声说出来。