UNPKG

@difizen/magent-core

Version:
71 lines (67 loc) 2.35 kB
import { transient } from '@difizen/mana-app'; import { inject } from '@difizen/mana-app'; import { registerSideOption } from '@difizen/mana-app'; import { Syringe } from '@difizen/mana-app'; export var AutoFactoryOption = Syringe.defineToken('AutoFactoryOption'); export var AutoFactoryMeta = Syringe.defineToken('AutoFactoryMeta', { multiple: false }); // export const AutoFactory = Syringe.defineToken('AutoFactory', { multiple: false }); // export type AutoFactory = <T>(token: Newable<T>) => (...args: any[]) => T; export function autoFactory() { return function (target) { var AutoFactoryToken = Symbol(); Reflect.defineMetadata(AutoFactoryMeta, AutoFactoryToken, target); transient()(target); // registerSideOption( // { // token: AutoFactory, // useFactory: (ctx: Syringe.Context) => { // return (token: Newable<T>) => { // const factoryToken = Reflect.getMetadata(AutoFactoryMeta, token); // const factory = ctx.container.get<(...args: any[]) => T>(factoryToken); // return (...args: any[]): T => { // return factory(...args); // }; // }; // }, // }, // target, // ); registerSideOption({ token: AutoFactoryToken, useFactory: function useFactory(ctx) { return function (option) { var child = ctx.container.createChild(); child.register({ token: AutoFactoryOption, useValue: option }); return child.get(target); }; } }, target); }; } export var toAutoFactory = function toAutoFactory(target) { var factoryToken = Reflect.getOwnMetadata(AutoFactoryMeta, target); if (!factoryToken) { throw new Error("Cannot find factory token for ".concat(target.constructor.name)); } return factoryToken; }; export var injectFactory = function injectFactory(token) { return function (target, targetKey, index) { var factoryToken = toAutoFactory(token); inject(factoryToken)(target, targetKey, index); }; }; export var modelFactory = function modelFactory(option, modelToken, ctx) { var child = ctx.container.createChild(); child.register({ token: AutoFactoryOption, useValue: option, lifecycle: Syringe.Lifecycle.singleton }); return child.get(modelToken); };