diff --git a/src/main/ts/di/Annotations.ts b/src/main/ts/di/Annotations.ts --- a/src/main/ts/di/Annotations.ts +++ b/src/main/ts/di/Annotations.ts @@ -1,21 +1,21 @@ -import { Constructor } from "../interfaces"; import { primitive } from "../safe"; +import { TypeRegistration } from "./Configuration"; export interface InjectOptions { lazy?: boolean; } -interface Dependency { +export interface Dependency { $dependency: K; lazy?: boolean; } -interface Lazy extends Dependency { +export interface Lazy extends Dependency { lazy: true; } -type Compatible = T1 extends T2 ? any : never; +type Compatible = T2 extends T1 ? any : never; type ExtractService = K extends keyof S ? S[K] : K; @@ -26,21 +26,10 @@ type ExtractDependency = D extends type WalkDependencies = D extends primitive ? D : { [K in keyof D]: ExtractDependency }; -interface Services { - get(name: K): Dependency; - - lazy(name: K): Lazy; - - build(): Builder; -} - -export declare function services(): Services; - -export declare function build(): Builder; - export class Builder { - consume

(...args: P) { + declare

(...args: P) { return ) => T>(constructor: C) => { + return constructor as C & { service: Builder }; }; } @@ -59,17 +48,28 @@ export class Builder { }; } - cast(): Builder { - return this as Builder; - } - - get(name: K): Dependency { + getDescriptor(): TypeRegistration { throw new Error(); } - lazy(name: K): Lazy { - throw new Error(); - } +} + +interface Declaration { + define(): Builder; + + dependency(name: K, opts: { lazy: true }): Lazy; + dependency(name: K, opts?: any): Dependency; + + config(): Config; +} +interface ServiceModule { + service: Builder; +} +interface Config { + register(name: K, builder: Builder): Config>; + register(name: K, m: Promise>): Config>; } + +export declare function declare(): Declaration; diff --git a/src/test/ts/mock/Bar.ts b/src/test/ts/mock/Bar.ts --- a/src/test/ts/mock/Bar.ts +++ b/src/test/ts/mock/Bar.ts @@ -1,12 +1,12 @@ import { Foo } from "./Foo"; -import { build } from "./config"; +import { define, dependency } from "./services"; -const service = build(); +export const service = define(); -@service.consume({ - foo: service.get("foo"), +@service.declare({ + foo: dependency("foo"), nested: { - lazy: service.lazy("foo") + lazy: dependency("foo", {lazy: true}) } }) export class Bar { diff --git a/src/test/ts/mock/Box.ts b/src/test/ts/mock/Box.ts --- a/src/test/ts/mock/Box.ts +++ b/src/test/ts/mock/Box.ts @@ -1,17 +1,12 @@ -import { services } from "../di/Annotations"; import { Bar } from "./Bar"; -import { Foo } from "./Foo"; - -// declare required dependencies -const config = services<{ - bar: Bar; - foo: Foo; -}>(); +import { define, dependency } from "./services"; // export service descriptor -export const service = config.build>(); +// через service передается информация о типе зависимости +// даже если это шаблон. +export const service = define>(); -@service.consume(config.get("bar")) +@service.declare(dependency("bar")) export class Box { private _value: T | undefined; @@ -19,13 +14,13 @@ export class Box { this._value = value; } - @service.inject( config.get("bar")) - setValue(value?: T) { + @service.inject(dependency("bar")) + setValue(value: T) { this._value = value; return value; } - setObj(value: object) { + setObj(value: any) { } diff --git a/src/test/ts/mock/config.ts b/src/test/ts/mock/config.ts --- a/src/test/ts/mock/config.ts +++ b/src/test/ts/mock/config.ts @@ -1,27 +1,6 @@ -import { Foo } from "./Foo"; -import { Bar } from "./Bar"; -import { Box } from "./Box"; -import { Builder } from "../di/Annotations"; - -interface Services { - foo: Foo; - - bar: Bar; - - box: Box; - - host: string; +import { config } from "./services"; -} - -const services = { - build: () => { - return new Builder(); - } -}; - -namespace services { - -} - -export = services; +config() + .register("bar", import("./Bar")) + .register("box", import("./Box")) + .register("foo", import("./Foo"), "Foo"); diff --git a/src/test/ts/mock/services.ts b/src/test/ts/mock/services.ts new file mode 100644 --- /dev/null +++ b/src/test/ts/mock/services.ts @@ -0,0 +1,23 @@ +import { Foo } from "./Foo"; +import { Bar } from "./Bar"; +import { Box } from "./Box"; +import { declare } from "../di/Annotations"; + +/** + * Сервисы доступные внутри контейнера + */ +export interface Services { + foo: Foo; + + bar: Bar; + + box: Box; + + host: string; + +} + +/** + * Экспортируем вспомогательные функции для описания сервисов и кинфогурации + */ +export const { define, dependency, config } = declare();