# HG changeset patch # User cin # Date 2020-07-20 16:11:08 # Node ID 882b53b2ba5b335e4d82e7fd4ced4eeccf35b005 # Parent 850cc60b6e2aaee96170ff36722812b8820abf08 working on fluent configuration diff --git a/src/main/ts/di/fluent/RegistrationBuilder.ts b/src/main/ts/di/fluent/RegistrationBuilder.ts new file mode 100644 --- /dev/null +++ b/src/main/ts/di/fluent/RegistrationBuilder.ts @@ -0,0 +1,37 @@ +import { ServiceRecordBuilder, ExtractDependency, RegistrationVisitor } from "./interfaces"; +import { ActivationType } from "../interfaces"; + +export class RegistrationBuilder { + private _activationType: ActivationType = "call"; + + private _overrides: { [m in keyof S]?: (...args: any) => void } | undefined; + + + override(name: K, builder: S[K], raw: true): this; + override(name: K, builder: (t: ServiceRecordBuilder) => void): this; + override(name: S[K] extends ExtractDependency ? K : never, value: V): this; + override(name: K, builder: S[K] | ((t: ServiceRecordBuilder) => void), raw: boolean = false) { + if (!this._overrides) + this._overrides = {}; + if (raw) { + + } else if (builder instanceof Function) { + + } else { + + } + return this; + } + + activate(activation: ActivationType) { + this._activationType = activation; + return this; + } + inject(member: T[M] extends (...params: ExtractDependency) => any ? M : never, ...params: P) { + return this; + } + + visit(visitor: RegistrationVisitor) { + + } +} \ No newline at end of file diff --git a/src/main/ts/di/fluent/interfaces.ts b/src/main/ts/di/fluent/interfaces.ts --- a/src/main/ts/di/fluent/interfaces.ts +++ b/src/main/ts/di/fluent/interfaces.ts @@ -2,7 +2,7 @@ import { primitive } from "../../safe"; import { ActivationType } from "../interfaces"; import { AnnotaionBuilder } from "../Annotations"; import { LazyDependencyRegistration, DependencyRegistration } from "../Configuration"; -import { PromiseOrValue } from "../../interfaces"; +import { Container } from "../Container"; export interface DependencyOptions { optional?: boolean; @@ -28,19 +28,37 @@ export type ServiceModule; }; -export interface ServiceBuilder { +export interface ServiceRecordBuilder { type

) => T>( target: C, ...params: P): ConstructorBuilder; factory

) => T>( target: F, ...params: P): FactoryBuilder; - wired(module: PromiseOrValue>, m: M): RegistrationBuilder; - wired(module: PromiseOrValue>): RegistrationBuilder; + wired(module: ServiceModule, m: M): RegistrationBuilder; + wired(module: ServiceModule): RegistrationBuilder; +} + +export interface RegistrationVisitor { + visitDependency(): void; + + visitObject(): void; + + visitTypeRegistration(): void; + + visitFactoryRegistration(): void; + + visitBuilder(builder: (t: ServiceRecordBuilder) => void): void; + } export interface RegistrationBuilder { - override(name: K, builder: S[K] | ((t: ServiceBuilder) => any)): this; + override(name: K, builder: S[K], raw: true): this; + override(name: K, builder: (t: ServiceRecordBuilder) => void): this; + override(name: S[K] extends ExtractDependency ? K : never, value: V): this; + activate(activation: ActivationType): this; inject(member: T[M] extends (...params: ExtractDependency) => any ? M : never, ...params: P): this; + + visit(visitor: RegistrationVisitor): void; } export interface ConstructorBuilder any, S extends object> extends RegistrationBuilder, S> { @@ -52,11 +70,15 @@ export interface FactoryBuilder { - register(name: K, builder: S[K] | ((t: ServiceBuilder) => any)): ConfigBuilder>; + register(name: K, builder: (t: ServiceRecordBuilder) => void | Promise): ConfigBuilder>; + register(name: S[K] extends ExtractDependency ? K : never, value: V): ConfigBuilder>; + register(name: K, value: S[K], raw: true): ConfigBuilder>; + + apply(container: Container): Promise; } interface ServicesDeclaration { - build(this: void): ServiceBuilder; + build(this: void): ServiceRecordBuilder; annotate(this: void): AnnotaionBuilder; dependency(this: void, name: K, opts: LazyDependencyOptions): LazyDependencyRegistration; 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,28 +1,17 @@ import { configure, dependency, build } from "./services"; -import { Foo } from "./Foo"; -import { Bar } from "./Bar"; -import { Box } from "./Box"; export const config = configure() - .register("bar", s => s - .wired(import("./Bar"), "service") - .inject("setName", "heell") - ) - .register("box", s => s.wired(import("./Box"))) + .register("bar", async s => s.wired(await import("./Bar"), "service")) + .register("box", s => import("./Box").then(m => s.wired(m))) .register("host", "example.com") // .registerType("bar2", Bar, [{ foo: dependency("foo"), host: "" }]); - .register("bar2", s => s.type(Bar, + .register("bar2", async s => s.type((await import("./Bar")).Bar, { - foo: build().type(Foo) + foo: build().type((await import("./Foo")).Foo) .activate("context"), - nested: { lazy: dependency("foo", {lazy: true}) }, + nested: { lazy: dependency("foo", { lazy: true }) }, host: dependency("host") }, "") .inject("setName", dependency("host")) - ) - .register("box", s => s - .type(Box, dependency("bar")) - .activate("context") ); -