@difizen/magent-core
Version:
71 lines (67 loc) • 2.35 kB
JavaScript
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);
};