Я начал использовать InversifyJS в разработке Dynamics 365. Чтобы дать вам некоторый контекст, Dynamics позволяет вам расширить платформу, написав пользовательскую бизнес-логику (с использованием JS) и прикрепив ее к определенным событиям формы. В этом примере я хочу создать экземпляр класса бизнес-логики и выполнить собственный код в событии загрузки формы. Код должен выглядеть так:
namespace Example {
export function onLoad(context: ExternalContext) {
set bl = container.resolve<BusinessLogic>(BusinessLogic);
bl.doSomething();
}
}
Как вы можете себе представить, функция onLoad будет вызываться Dynamics 365 при возникновении события. Контекст формы (ExternalContext в этом примере) будет передан функции в качестве параметра. Этот объект действительно важен, потому что он позволяет нашему коду взаимодействовать с элементами управления, которые существуют в форме, и именно этот объект я хочу внедрить в класс 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??
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На всякий случай, если кто-то еще столкнется с этим сценарием, я реализовал это, обернув контейнер в класс с частной переменной, где я могу хранить свой 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();
}
}
Вероятно, есть лучший способ сделать это, поэтому, пожалуйста, кричите, если вы можете понять это.