InversifyJS - внедрить указанный экземпляр объекта - PullRequest
2 голосов
/ 12 июня 2019

Я начал использовать InversifyJS в разработке Dynamics 365. Чтобы дать вам некоторый контекст, Dynamics позволяет вам расширить платформу для написания пользовательской бизнес-логики (используя JS) и присоединить ее к определенным событиям формы. В этом примере я хочу создать экземпляр класса логики своего бизнеса и выполнить свой пользовательский код в событии onload формы. Код должен выглядеть так:

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

Как вы можете себе представить, функция onLoad будет вызываться Dynamics 365, когда происходит событие. Контекст формы (ExternalContext в этом примере) будет передан в качестве параметра функции. Этот объект действительно важен, потому что он позволяет нашему коду взаимодействовать с элементами управления, существующими в форме, и именно этот объект я хочу внедрить в BusinessLogic класс .

Класс 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 голосов
/ 28 июня 2019

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

Вероятно, есть лучший способ сделать это, поэтому, пожалуйста, кричите, если сможете разобраться.

...