This commit is contained in:
crusader 2018-01-02 21:25:09 +09:00
parent b7f366be76
commit 81fe770489
24 changed files with 757 additions and 204 deletions

View File

@ -32,7 +32,7 @@ export class Application {
/** /**
* run * run
*/ */
public async run(): Promise<ApplicationContext> { public run(): ApplicationContext {
let runner = this.findRunner(); let runner = this.findRunner();
if (undefined === runner) { if (undefined === runner) {
throw new Error(`There is not exist @Runner on Application[${this._primaryClass.name}]`); throw new Error(`There is not exist @Runner on Application[${this._primaryClass.name}]`);
@ -43,7 +43,7 @@ export class Application {
let instance = clazz.getConstructor().newInstance(); let instance = clazz.getConstructor().newInstance();
instanceFactory.applyInstance(this._primaryClass, instance); instanceFactory.applyInstance(this._primaryClass, instance);
await runner.invoke(instance); runner.invoke(instance);
return this._applicationContext; return this._applicationContext;
} }

View File

@ -0,0 +1,46 @@
import {
ClassType,
} from '@overflow/commons/core/type';
import {
Class,
} from '@overflow/commons/core/reflect';
import {
InstanceDefinition,
InstanceFactory,
} from '@overflow/commons/di/factory';
import { InstanceDefinitionReader } from './instance_definition_reader';
export class ApplicationContext {
private _instanceFactory: InstanceFactory;
private _instanceDefinitionReader: InstanceDefinitionReader;
public constructor(injectables: ClassType[]) {
this._instanceFactory = new InstanceFactory();
this._instanceDefinitionReader = new InstanceDefinitionReader();
this.initializeInjectables(injectables);
}
private initializeInjectables(injectables: ClassType[]): void {
if (undefined === injectables) {
return;
}
injectables.forEach(injectable => {
let name = injectable.name;
let definition: InstanceDefinition = new InstanceDefinition(injectable);
this._instanceFactory.registerInstanceDefinition(name, definition);
});
}
/**
* instanceFactory
*/
public get instanceFactory(): InstanceFactory {
return this._instanceFactory;
}
}

View File

@ -1,41 +1,86 @@
import { import {
ClassType,
} from '@overflow/commons/core/type';
import {
Class,
} from '@overflow/commons/core/reflect';
import {
InstanceDefinition,
InstanceFactory, InstanceFactory,
} from '@overflow/commons/di/factory'; } from '@overflow/commons/di/factory';
import { ApplicationContextIDType } from '@overflow/commons/application/type';
import { MessageSource } from './message_source';
import { InstanceDefinitionReader } from './instance_definition_reader';
export class ApplicationContext { export class ApplicationContext {
private _instanceFactory: InstanceFactory; public static readonly MESSAGE_SOURCE_INSTANCE_NAME: string = 'messageSource';
public constructor(injectables: ClassType[]) { private readonly instanceFactoryPostProcessors: InstanceFactoryPostProcessor[] = [];
this._instanceFactory = new InstanceFactory();
this.initializeInjectables(injectables); private id: ApplicationContextIDType;
private parent: ApplicationContext;
private messageSource: MessageSource;
private instanceFactory: InstanceFactory;
private instanceDefinitionReader: InstanceDefinitionReader;
public constructor(parent?: ApplicationContext) {
this.setParent(parent);
} }
private initializeInjectables(injectables: ClassType[]): void { // Context
if (undefined === injectables) {
return; public getID(): ApplicationContextIDType {
return this.id;
} }
injectables.forEach(injectable => { public setID(id: ApplicationContextIDType): void {
let name = injectable.name; this.id = id;
let definition: InstanceDefinition = new InstanceDefinition(injectable);
this._instanceFactory.registerInstanceDefinition(name, definition);
});
} }
/** public getApplicationName(): string {
* instanceFactory return undefined;
*/
public get instanceFactory(): InstanceFactory {
return this._instanceFactory;
} }
public getParent(): ApplicationContext {
return this.parent;
}
public setParent(parent: ApplicationContext): void {
this.parent = parent;
}
public getInstanceFactory(): InstanceFactory {
return undefined;
}
// Configuration
public addInstanceFactoryPostProcessor(instanceFactoryPostProcessor: InstanceFactoryPostProcessor): void {
this.instanceFactoryPostProcessors.push(instanceFactoryPostProcessor);
}
public getInstanceFactoryPostProcessor(): InstanceFactoryPostProcessor[] {
return this.instanceFactoryPostProcessors;
}
public addApplicationListener(listener: ApplicationListener): void {
//
}
public registerShutdownHook(): void {
//
}
public initMessageSource(): void {
//
}
// MessageSource
public getMessageSource(): MessageSource {
return this.messageSource;
}
// Lifecycle
public start(): void {
//
}
public stop(): void {
//
}
public isRunning(): boolean {
return false;
}
} }

View File

@ -1 +1,2 @@
export * from './application_context'; export * from './application_context';
export * from './instance_definition_reader';

View File

@ -0,0 +1,24 @@
import {
ClassType,
} from '@overflow/commons/core/type';
import {
InstanceDefinitionRegistry, InstanceNameGenerator,
} from '@overflow/commons/di/factory';
export class InstanceDefinitionReader {
private instanceDefinitionRegistry: InstanceDefinitionRegistry;
private instanceNameGenerator: InstanceNameGenerator;
public constructor(registry: InstanceDefinitionRegistry) {
//
}
public register(...injectables: ClassType[]): void {
//
}
public registerInstance(injectable: ClassType): void {
//
}
}

View File

@ -0,0 +1,7 @@
import { Locale } from '@overflow/commons/core/util';
export class MessageSource {
public getMessage(code: string, args: any[], defaultMessage: string | undefined, locale: Locale): string {
return undefined;
}
}

View File

@ -1,3 +1,7 @@
import { IdentityType } from '@overflow/commons/core/type';
export type ApplicationContextIDType = IdentityType<string>;
// import { // import {
// ClassType, // ClassType,
// } from '@overflow/commons/core/type'; // } from '@overflow/commons/core/type';
@ -20,3 +24,4 @@
// } // }
// export type InjectablesType = ClassType | InjectableClass | InjectableFactory | InjectableValue; // export type InjectablesType = ClassType | InjectableClass | InjectableFactory | InjectableValue;

View File

@ -1,6 +1,15 @@
export class IllegalArgumentError extends Error {
public constructor(message?: string) {
super(message);
Object.setPrototypeOf(this, new.target.prototype);
}
}
export class NotSupportedDecoratorError extends Error { export class NotSupportedDecoratorError extends Error {
public constructor(message?: string) { public constructor(message?: string) {
super(message); super(message);
Object.setPrototypeOf(this, new.target.prototype); Object.setPrototypeOf(this, new.target.prototype);
} }
} }

View File

@ -22,3 +22,10 @@ export enum DecoratorType {
METHOD = 'method', METHOD = 'method',
PARAMETER = 'parameter', PARAMETER = 'parameter',
} }
export enum LocaleDisplayType {
LANGUAGE = 'LANGUAGE',
COUNTRY = 'COUNTRY',
VARIANT = 'VARIANT',
SCRIPT = 'SCRIPT',
}

View File

@ -0,0 +1,67 @@
import { IllegalArgumentError } from '../type/error';
import { StringUtil, StringUtils } from './string';
export abstract class Assert {
/**
* isTrue
*/
public static isTrue(expression: boolean, message?: string): void {
if (!expression) {
throw new IllegalArgumentError(undefined !== message ? message : '[Assertion failed] - this expression must be true');
}
}
/**
* isUndefined
*/
public static isUndefined(obj: any, message?: string): void {
if (undefined !== obj) {
throw new IllegalArgumentError(undefined !== message ? message : '[Assertion failed] - the object argument must be undefined');
}
}
/**
* notUndefined
*/
public static notUndefined(obj: any, message?: string): void {
if (undefined === obj) {
throw new IllegalArgumentError(undefined !== message ? message : '[Assertion failed] - the object argument must not be undefined');
}
}
/**
* isNull
*/
public static isNull(obj: any, message?: string): void {
if (undefined === obj || null !== obj) {
throw new IllegalArgumentError(undefined !== message ? message : '[Assertion failed] - the object argument must be null');
}
}
/**
* isNull
*/
public static notNull(obj: any, message?: string): void {
if (undefined === obj || null === obj) {
throw new IllegalArgumentError(undefined !== message ? message : '[Assertion failed] - the object argument must not be null');
}
}
/**
* isNull
*/
public static hasLength(text: string, message?: string): void {
if (!StringUtils.hasLength(text)) {
throw new IllegalArgumentError(
undefined !== message
? message
: '[Assertion failed] - this String argument must have length; it must not be null or empty',
);
}
}
}

View File

@ -1 +1,4 @@
export * from './assert';
export * from './locale';
export * from './registry'; export * from './registry';
export * from './string';

View File

@ -0,0 +1,3 @@
export class Locale {
}

View File

@ -0,0 +1,73 @@
export abstract class StringUtils {
private static readonly FOLDER_SEPARATOR: string = '/';
private static readonly WINDOWS_FOLDER_SEPARATOR: string = '\\';
private static readonly TOP_PATH: string = '..';
private static readonly CURRENT_PATH: string = '.';
private static readonly EXTENSION_SEPARATOR: string = '.';
/**
* isEmpty
*/
public static isEmpty(str: string): boolean {
return (undefined === str || null === str || '' === str);
}
/**
* hasLength
*/
public static hasLength(str: string): boolean {
return (undefined !== str && null !== str || 0 < str.length);
}
/**
* hasText
*/
public static hasText(str: string): boolean {
if (!StringUtils.hasLength(str)) {
return false;
}
let t = StringUtils.trimAllWhitespace(str);
return 0 !== t.length;
}
/**
* containsWhitespace
*/
public static containsWhitespace(str: string): boolean {
if (!StringUtils.hasLength(str)) {
return false;
}
return /\s/.test(str);
}
/**
* trimAllWhitespace
*/
public static trimAllWhitespace(str: string): string {
if (!StringUtils.hasLength(str)) {
return str;
}
return str.replace(/^\s+|\s+$/g, '');
}
/**
* trimLeadingWhitespace
*/
public static trimLeadingWhitespace(str: string): string {
if (!StringUtils.hasLength(str)) {
return str;
}
return str.replace(/^\s*/, '');
}
/**
* trimTrailingWhitespace
*/
public static trimTrailingWhitespace(str: string): string {
if (!StringUtils.hasLength(str)) {
return str;
}
return str.replace(/\s*$/, '');
}
}

View File

@ -0,0 +1,42 @@
import {
ClassType, PropertyKeyType,
} from '@overflow/commons/core/type';
import {
Class,
} from '@overflow/commons/core/reflect';
import {
InstanceNameType,
} from '@overflow/commons/di/type';
import { InjectableAnnotation } from '@overflow/commons/di/decorators';
export class InstanceDefinition {
private _instanceClass: Class;
private _injectableAnnotation: InjectableAnnotation;
public constructor(instanceClassType: ClassType) {
let clazz = Class.forClassType(instanceClassType);
if (undefined === clazz) {
throw new Error(`Class[${instanceClassType.name}] is not injectable type. Add @Injectable annotation.`);
}
let injectableAnnotation: InjectableAnnotation = clazz.getOwnAnnotation(InjectableAnnotation);
if (undefined === injectableAnnotation) {
throw new Error(`Class is not Injectable type. Add @Injectable annotation to class[${instanceClassType.name}]`);
}
this._injectableAnnotation = injectableAnnotation;
}
public get instanceClass(): Class {
return this._instanceClass;
}
/**
* getAttribute
*/
public get annotation(): InjectableAnnotation {
return this._injectableAnnotation;
}
}

View File

@ -0,0 +1,178 @@
import {
ClassType, PropertyKeyType,
} from '@overflow/commons/core/type';
import {
Class, Annotation, Field,
} from '@overflow/commons/core/reflect';
import {
ValueAnnotation, InjectAnnotation, ResourceAnnotation,
} from '@overflow/commons/di/decorators';
import {
InstanceNameType,
InstanceFactoryType,
} from '@overflow/commons/di/type';
import {InstanceDefinitionRegistry} from './instance_definition_registry';
import {InstanceDefinition} from './instance_definition';
export class InstanceFactory implements InstanceDefinitionRegistry {
private _singletonObjects: Map<InstanceNameType, any> = new Map();
private _singletonFactories: Map<InstanceNameType, InstanceFactoryType> = new Map();
private _instanceDefinitionMap: Map<InstanceNameType, InstanceDefinition> = new Map();
private _instanceDefinitionNames: Set<InstanceNameType> = new Set();
private _values: any;
/**
* getInstance
*/
public getInstance(name: InstanceNameType | undefined, requiredType: ClassType | undefined, ...args: any[]): any | undefined {
if (undefined === name && undefined === requiredType) {
throw new Error('One of name or requiredType must be specified.');
}
if (undefined === name) {
name = requiredType.name;
}
let sharedInstance = this.getSingleton(name);
if (undefined !== sharedInstance) {
return sharedInstance;
}
let instanceDefinition = this.getInstanceDefinition(name);
let clazz = instanceDefinition.instanceClass;
let ctor = clazz.getConstructor();
let ctorParams = ctor.getParameters();
let ctorArgs = [];
if (0 < ctorParams.length) {
//
}
let instance = ctor.newInstance(ctorArgs);
this.applyInstance(clazz.getType(), instance);
return instance;
}
/**
* applyInstance
*/
public injectByName(name: InstanceNameType, instanceDefinition: InstanceDefinition): void {
//
}
public injectByType(name: InstanceNameType, instanceDefinition: InstanceDefinition): void {
//
}
/**
* applyInstance
*/
public applyInstance(clazzType: ClassType, instance: any): void {
let clazz: Class = Class.forClassType(clazzType);
let fields = clazz.getFields();
fields.forEach((field: Field, key: PropertyKeyType, map: Map<PropertyKeyType, Field>): void => {
let fieldAnnotations = field.getAnnotations();
fieldAnnotations.forEach((value: Annotation, annonType: ClassType, annonMap: Map<ClassType, Annotation>): void => {
switch (annonType) {
case ValueAnnotation:
{
let annon = <ValueAnnotation>value;
instance[field.getName()] = this.getValue(annon.attributes.value);
}
break;
case InjectAnnotation:
{
let annon = <InjectAnnotation>value;
instance[field.getName()] = this.getInstance(annon.attributes.name, field.getType());
}
break;
case ResourceAnnotation:
{
let annon = <ResourceAnnotation>value;
instance[field.getName()] = this.getSingleton(annon.attributes.name || field.getName());
}
break;
default:
break;
}
});
});
}
private getSingleton(name: InstanceNameType): any | undefined {
let singletonObject = this._singletonObjects.get(name);
return singletonObject;
}
/**
* containsInstance
*/
public containsInstance(name: InstanceNameType): boolean {
return false;
}
public registerJSON(json: any): void {
this._values = json;
}
/**
* getValue
*/
public getValue(keyPath: string): any {
let paths = keyPath.split('.');
let result = this._values;
for (let i = 0, len = paths.length; i < len; i++) {
result = result[paths[i]];
}
return result;
}
public registerSingleton(name: InstanceNameType, instanceType: any, instance: any): void {
this._singletonObjects.set(name, instance);
}
public registerInstanceDefinition(name: InstanceNameType, instanceDefinition: InstanceDefinition): void {
let oldInstanceDefinition = this._instanceDefinitionMap.get(name);
if (undefined !== oldInstanceDefinition) {
throw new Error(`InstanceDefinition[${name}] is already exist.`);
}
this._instanceDefinitionNames.add(name);
this._instanceDefinitionMap.set(name, instanceDefinition);
}
public removeInstanceDefinition(name: InstanceNameType): void {
if (!this._instanceDefinitionMap.has(name)) {
throw new Error(`InstanceDefinition[${name}] is not exist.`);
}
this._instanceDefinitionNames.delete(name);
this._instanceDefinitionMap.delete(name);
}
public getInstanceDefinition(name: InstanceNameType): InstanceDefinition | undefined {
return this._instanceDefinitionMap.get(name);
}
public containsInstanceDefinition(name: InstanceNameType): boolean {
return this._instanceDefinitionMap.has(name);
}
public getInstanceDefinitionNames(): Set<InstanceNameType> {
return this._instanceDefinitionNames;
}
public getInstanceDefinitionCount(): number {
return this._instanceDefinitionMap.size;
}
public isInstanceNameInUse(name: InstanceNameType): boolean {
return false;
}
}

View File

@ -0,0 +1,7 @@
export class DependencyDescriptor {
private methodParameter: MethodParameter;
private field: Field;
private declaringClass: ClassType;
}

View File

@ -1,3 +1,4 @@
export * from './instance_definition_registry'; export * from './instance_definition_registry';
export * from './instance_definition'; export * from './instance_definition';
export * from './instance_factory'; export * from './instance_factory';
export * from './instance_name_generator';

View File

@ -1,42 +1,63 @@
import { import { Assert } from '@overflow/commons/core/util';
ClassType, PropertyKeyType, import { ScopeType, InjectModeType } from '@overflow/commons/di/type';
} from '@overflow/commons/core/type';
import {
Class,
} from '@overflow/commons/core/reflect';
import {
InstanceNameType,
} from '@overflow/commons/di/type';
import { InjectableAnnotation } from '@overflow/commons/di/decorators';
export class InstanceDefinition { export class InstanceDefinition {
private _instanceClass: Class; private readonly attributes: Map<string, any> = new Map();
private _injectableAnnotation: InjectableAnnotation; private scope: ScopeType = ScopeType.Default;
private injectMode: InjectModeType = InjectModeType.No;
public constructor(instanceClassType: ClassType) { // Attributes
let clazz = Class.forClassType(instanceClassType);
if (undefined === clazz) { public setAttribute(name: string, value?: any): void {
throw new Error(`Class[${instanceClassType.name}] is not injectable type. Add @Injectable annotation.`); Assert.notNull(name, 'Name must not be null');
if (value !== undefined) {
this.attributes.set(name, value);
} else {
this.removeAttribute(name);
}
} }
let injectableAnnotation: InjectableAnnotation = clazz.getOwnAnnotation(InjectableAnnotation); public getAttribute(name: string): any | undefined {
if (undefined === injectableAnnotation) { Assert.notNull(name, 'Name must not be null');
throw new Error(`Class is not Injectable type. Add @Injectable annotation to class[${instanceClassType.name}]`); return this.attributes.get(name);
}
this._injectableAnnotation = injectableAnnotation;
} }
public get instanceClass(): Class { public removeAttribute(name: string): boolean {
return this._instanceClass; Assert.notNull(name, 'Name must not be null');
return this.attributes.delete(name);
} }
/** public hasAttribute(name: string): boolean {
* getAttribute Assert.notNull(name, 'Name must not be null');
*/ return this.attributes.has(name);
public get annotation(): InjectableAnnotation { }
return this._injectableAnnotation;
public attributeNames(): IterableIterator<string> {
return this.attributes.keys();
}
public setScope(scope: ScopeType): void {
this.scope = scope;
}
public getScope(): ScopeType {
return this.scope;
}
public isSingleton(): boolean {
return ScopeType.Singleton === this.scope || ScopeType.Default === this.scope;
}
public isTransiant(): boolean {
return ScopeType.Transiant === this.scope;
}
public setInjectMode(injectMode: InjectModeType): void {
this.injectMode = injectMode;
}
public getInjectMode(): InjectModeType {
return this.injectMode;
} }
} }

View File

@ -1,178 +1,140 @@
import { import {
ClassType, PropertyKeyType, Annotation,
} from '@overflow/commons/core/type';
import {
Class, Annotation, Field,
} from '@overflow/commons/core/reflect'; } from '@overflow/commons/core/reflect';
import { import {
ValueAnnotation, InjectAnnotation, ResourceAnnotation, ClassType,
} from '@overflow/commons/di/decorators'; } from '@overflow/commons/core/type';
import { import {
InjectType,
InstanceNameType, InstanceNameType,
InstanceFactoryType,
} from '@overflow/commons/di/type'; } from '@overflow/commons/di/type';
import { InstanceDefinition } from './instance_definition';
import { InstanceDefinitionRegistry } from './instance_definition_registry';
import {InstanceDefinitionRegistry} from './instance_definition_registry'; export class InstanceFactory {
import {InstanceDefinition} from './instance_definition'; private instanceDefinitionRegistry: InstanceDefinitionRegistry;
// Instance
export class InstanceFactory implements InstanceDefinitionRegistry {
private _singletonObjects: Map<InstanceNameType, any> = new Map();
private _singletonFactories: Map<InstanceNameType, InstanceFactoryType> = new Map();
private _instanceDefinitionMap: Map<InstanceNameType, InstanceDefinition> = new Map();
private _instanceDefinitionNames: Set<InstanceNameType> = new Set();
private _values: any;
/**
* getInstance
*/
public getInstance(name: InstanceNameType | undefined, requiredType: ClassType | undefined, ...args: any[]): any | undefined { public getInstance(name: InstanceNameType | undefined, requiredType: ClassType | undefined, ...args: any[]): any | undefined {
if (undefined === name && undefined === requiredType) { return undefined;
throw new Error('One of name or requiredType must be specified.');
} }
if (undefined === name) {
name = requiredType.name;
}
let sharedInstance = this.getSingleton(name);
if (undefined !== sharedInstance) {
return sharedInstance;
}
let instanceDefinition = this.getInstanceDefinition(name);
let clazz = instanceDefinition.instanceClass;
let ctor = clazz.getConstructor();
let ctorParams = ctor.getParameters();
let ctorArgs = [];
if (0 < ctorParams.length) {
//
}
let instance = ctor.newInstance(ctorArgs);
this.applyInstance(clazz.getType(), instance);
return instance;
}
/**
* applyInstance
*/
public injectByName(name: InstanceNameType, instanceDefinition: InstanceDefinition): void {
//
}
public injectByType(name: InstanceNameType, instanceDefinition: InstanceDefinition): void {
//
}
/**
* applyInstance
*/
public applyInstance(clazzType: ClassType, instance: any): void {
let clazz: Class = Class.forClassType(clazzType);
let fields = clazz.getFields();
fields.forEach((field: Field, key: PropertyKeyType, map: Map<PropertyKeyType, Field>): void => {
let fieldAnnotations = field.getAnnotations();
fieldAnnotations.forEach((value: Annotation, annonType: ClassType, annonMap: Map<ClassType, Annotation>): void => {
switch (annonType) {
case ValueAnnotation:
{
let annon = <ValueAnnotation>value;
instance[field.getName()] = this.getValue(annon.attributes.value);
}
break;
case InjectAnnotation:
{
let annon = <InjectAnnotation>value;
instance[field.getName()] = this.getInstance(annon.attributes.name, field.getType());
}
break;
case ResourceAnnotation:
{
let annon = <ResourceAnnotation>value;
instance[field.getName()] = this.getSingleton(annon.attributes.name || field.getName());
}
break;
default:
break;
}
});
});
}
private getSingleton(name: InstanceNameType): any | undefined {
let singletonObject = this._singletonObjects.get(name);
return singletonObject;
}
/**
* containsInstance
*/
public containsInstance(name: InstanceNameType): boolean { public containsInstance(name: InstanceNameType): boolean {
return false; return false;
} }
public isSingleton(name: InstanceNameType): boolean {
public registerJSON(json: any): void { return false;
this._values = json; }
public isTransiant(name: InstanceNameType): boolean {
return false;
}
public isTypeMatch(name: InstanceNameType, typeToMatch: ClassType): boolean {
return false;
}
public getType(name: InstanceNameType): ClassType {
return undefined;
}
public getAliases(name: InstanceNameType): InstanceNameType[] {
return undefined;
} }
/** // Create Instance
* getValue
*/ public createInstance<T>(clazzType: ClassType<T>, injectMode?: InjectType, dependencyCheck?: boolean): T {
public getValue(keyPath: string): any { return undefined;
let paths = keyPath.split('.');
let result = this._values;
for (let i = 0, len = paths.length; i < len; i++) {
result = result[paths[i]];
}
return result;
} }
public registerSingleton(name: InstanceNameType, instanceType: any, instance: any): void { public injectInstance(instance: any): void {
this._singletonObjects.set(name, instance); //
} }
public registerInstanceDefinition(name: InstanceNameType, instanceDefinition: InstanceDefinition): void { public inject(clazzType: ClassType, injectMode?: InjectType, dependencyCheck?: boolean): any {
let oldInstanceDefinition = this._instanceDefinitionMap.get(name); //
if (undefined !== oldInstanceDefinition) {
throw new Error(`InstanceDefinition[${name}] is already exist.`);
}
this._instanceDefinitionNames.add(name);
this._instanceDefinitionMap.set(name, instanceDefinition);
} }
public removeInstanceDefinition(name: InstanceNameType): void { public injectInstanceProperties(instance: any, injectMode: InjectType, dependencyCheck: boolean): void {
if (!this._instanceDefinitionMap.has(name)) { //
throw new Error(`InstanceDefinition[${name}] is not exist.`);
}
this._instanceDefinitionNames.delete(name);
this._instanceDefinitionMap.delete(name);
} }
public getInstanceDefinition(name: InstanceNameType): InstanceDefinition | undefined { public applyInstancePropertyValues(instance: any, name: InstanceNameType): void {
return this._instanceDefinitionMap.get(name); //
}
public initializeInstance(instance: any, name: InstanceNameType): any {
//
}
public applyInstancePostProcessorsBeforeInitialization(instance: any, name: InstanceNameType): any {
//
}
public applyInstancePostProcessorsAfterInitialization(instance: any, name: InstanceNameType): any {
//
}
public configureInstance(instance: any, name: InstanceNameType): any {
//
}
public destroyInstance(instance: any): any {
//
}
public resolveDependency(descriptor: DependencyDescriptor, name: InstanceNameType, injectInstanceNames?: Set<InstanceNameType>): any {
//
}
public getInstanceNamesIterator(): IterableIterator<InstanceNameType> {
return undefined;
}
// InstanceDefinition
public getInstanceDefinition(): InstanceDefinition {
return undefined;
} }
public containsInstanceDefinition(name: InstanceNameType): boolean { public containsInstanceDefinition(name: InstanceNameType): boolean {
return this._instanceDefinitionMap.has(name);
}
public getInstanceDefinitionNames(): Set<InstanceNameType> {
return this._instanceDefinitionNames;
}
public getInstanceDefinitionCount(): number {
return this._instanceDefinitionMap.size;
}
public isInstanceNameInUse(name: InstanceNameType): boolean {
return false; return false;
} }
public getInstanceDefinitionCount(): number {
return 0;
}
public getInstanceDefinitionNames(): InstanceNameType[] {
return undefined;
}
public getInstanceNamesForType(clazzType: ClassType, includeNonSingletons?: boolean, allowEagerInit?: boolean): InstanceNameType[] {
return undefined;
}
public getInstancesOfType<T>(clazzType: ClassType, includeNonSingletons?: boolean, allowEagerInit?: boolean): Map<InstanceNameType, T> {
return undefined;
}
public getInstanceNamesForAnnotation<AnnotationType extends Annotation>(annotation: AnnotationType): InstanceNameType[] {
return undefined;
}
public getInstancesWithAnnotation<AnnotationType extends Annotation>(annotation: AnnotationType): Map<InstanceNameType, any> {
return undefined;
}
public findAnnotationOnInstance<AnnotationType extends Annotation>(name: InstanceNameType, annotation: AnnotationType): AnnotationType {
return undefined;
}
// Configuration
public ignoreDependencyType(clazzType: ClassType): void {
//
}
public registerResolvableDependency(dependencyType: ClassType, injectValue: any): void {
//
}
public isInjectCandidate(name: InstanceNameType, descriptor: DependencyDescriptor): boolean {
return false;
}
} }

View File

@ -0,0 +1,8 @@
import { InstanceDefinition } from './instance_definition';
import { InstanceDefinitionRegistry } from './instance_definition_registry';
export class InstanceNameGenerator {
public generateInstanceName(definition: InstanceDefinition, registry: InstanceDefinitionRegistry): string {
return undefined;
}
}

View File

@ -0,0 +1,21 @@
import {
InstanceNameType,
} from '@overflow/commons/di/type';
export class SingletonInstanceRegistry {
public registerSingleton(name: InstanceNameType, singleton: any): void {
//
}
public getSingleton(name: InstanceNameType): any {
return undefined;
}
public containsSingleton(name: InstanceNameType): boolean {
return false;
}
public getSingletonNames(): InstanceNameType[] {
return undefined;
}
public getSingletonCount(): number {
return 0;
}
}

View File

@ -0,0 +1,15 @@
export class InstanceError extends Error {
public constructor(message?: string) {
super(message);
Object.setPrototypeOf(this, new.target.prototype);
}
}
export class NoSuchInstanceDefinitionError extends InstanceError {
public constructor(message?: string) {
super(message);
Object.setPrototypeOf(this, new.target.prototype);
}
}

View File

@ -1 +1,2 @@
export * from './error';
export * from './type'; export * from './type';

View File

@ -6,6 +6,13 @@ export type InstanceNameType = IdentityType<string>;
export type InstanceFactoryType = (...args: any[]) => any; export type InstanceFactoryType = (...args: any[]) => any;
export enum ScopeType { export enum ScopeType {
Default = '',
Singleton = 'Singleton', Singleton = 'Singleton',
Transiant = 'Transiant', Transiant = 'Transiant',
} }
export enum InjectModeType {
No = 'No',
ByName = 'ByName',
ByType = 'ByType',
}