inversify + effector integration
Проект состоит из трех модулей:
-
@infector/model
Предоставляет интерфейс
export interface IModel { inc: Event<void | any> dec: Event<void | any> getStore(): Store<number> destroy(): void }
-
@infector/model-addon
export interface IModelAddon { add: Event<number> sub: Event<number> destroy: () => void }
-
@infector/main-react-app React приложение, использующее два вышеуказанных модуля.
App | +-- [<Counter />, ...] // массив счетчиков | | | +-- контейнеры с интерфейсом ICounter | | | +-- контейнер IModel | | | +-- контейнер IModelAddon | +-- <SingletonCheckbox ... /> // переключение режима Singleton/Transient scopes
ICounter interface
export interface ICounter extends IModel, IModelAddon {
destroy: () => void
}
Модули model
и model-addon
полностью независимые, являются отдельными npm
пакетами и предоставляют публичное api через свои интерфейсы.
Модуль model
позволяет создать контейнеры с effector store типа number,
а так же два метода для увеличения/уменьшения значения стора
Модуль model-addon
создает контейнер, к которому можно во время инициализации
забиндить любой внешний стор. Модуль добавляет к внешнему стору функциональность
для добавления и вычитания числового значения.
Например, так выглядит создание двух контейнеров Model, ModelAddon
const model = ctx.container.get<IModel>(IModel)
const addon = ctx.container.getTagged<IModelAddon>(IModelAddon, IExternalStore, model.getStore())
IExternalStore является extension point (точкой расширения) для класса ModelAddon и при привязке к нему значения мапит его в приватное свойство класса ModelAddon.
В реакт приложении для компонента Counter есть контейнер с интерфейсом ICounter, который объединяет в себе API от Model и ModelAddon для работы с одним и тем же стором.
В режиме по умолчанию inTransientScope каждый запрос контейнера ICounter будет создавать новый инстанс со своими Model и ModelAddon, по сути являясь фабрикой.
В Режиме inSingletonScope при первом запросе будет создан singleton контейнер, а каждый последующий запрос получит его инстанс из cache.
infector> yarn && yarn start
infector> yarn build:model
infector> yarn build:addon
infector> yarn test:addon
Последняя команда запустит packages/model-addon/src/example.ts