diff --git a/di-lite/di-lite-test.ts b/di-lite/di-lite-test.ts new file mode 100644 index 000000000..8d6bfb777 --- /dev/null +++ b/di-lite/di-lite-test.ts @@ -0,0 +1,139 @@ +/// + +interface Dependency { + dependencies?: string; +} + +function doTest(test: (ctx: any, ...obj: Dependency[]) => void) { + // create di context + var ctx = di.createContext(), + A: Dependency = () => { + this.dependencies = "b, c"; + }, + B: Dependency = () => { + this.dependencies = "c"; + }, + C: Dependency = () => {}; + + // register a class with an unique name + ctx.register("a", A); + ctx.register("b", B); + ctx.register("c", C); + + test(ctx, A, B, C); +} + +module BasicWiring { + doTest(ctx => { + // initialize di container so all singleton(default) objects will be wired at this stage + ctx.initialize(); + + var instanceOfA = ctx.get("a"); + instanceOfA.b === ctx.get("b"); // true + instanceOfA.c === ctx.get("c"); // true + + var instanceOfB = ctx.get("b"); + instanceOfB.c === ctx.get("c"); // true + }); +} + +module WiringWithAssignment { + doTest((ctx, A) => { + A.dependencies = "bee=b, c"; // mix explicit and implicit assignment + + ctx.initialize(); + + var instanceOfA = ctx.get("a"); + instanceOfA.bee === ctx.get("b"); // true - explicit assignment + instanceOfA.c === ctx.get("c"); // true - implicit assignment + }); +} + +module PassiveDependencyResolution { + doTest((ctx, A) => { + ctx.register("a", A); + ctx.get("a"); // this triggers the dependency resolution for "a" alone + ctx.initialize(); + }); +} + +module PrototypeStrategy { + doTest((ctx, A) => { + ctx.register("prototype", A).strategy(di.strategy.proto); + ctx.get("prototype") === ctx.get("prototype"); // false + ctx.create("prototype", 100); // create can be used if you want to explicitly pass in a new parameter + }); +} + +module PassingConstructorArguments { + class ProfileView { } + + doTest(ctx => { + ctx.register("str", String, "hello world"); // signle simple argument + ctx.register("profileView", ProfileView, { el: "#profile_div" }); // signle object literal argument + ctx.register("array", Array, ["Saab", "Volvo", "BMW"]); // multiple argument is passed in using an array + }); +} + +module CyclicalDependency { + doTest((ctx, A, B) => { + A.dependencies = "b"; + B.dependencies = "a"; + + ctx.register("a", A); + ctx.register("b", B); + + ctx.initialize(); + + ctx.get("a").b === ctx.get("b"); // true + ctx.get("b").a === ctx.get("a"); // true + ctx.get("a").b.a === ctx.get("a"); // true + ctx.get("b").a.b === ctx.get("b"); // true + }); +} + +module FunctionalObject { + doTest(ctx => { + var FuncObject = (spec: any) => { + var that = {}; + return that; + }, + spec: any = []; + + ctx.register("funcObjSingleton", FuncObject, spec).factory(di.factory.func); + + // function chaining can be used to customize your object registration + ctx.register("funcObjProto", FuncObject, spec) + .strategy(di.strategy.proto) + .factory(di.factory.func); + + ctx.initialize(); + + ctx.get("funcObjSingleton"); // will return you a signleton instance of FuncObject + ctx.get("funcObjProto"); // will return you a new instance of FuncObject each time + }); +} + +module RuntimeDependenciesOverride { + doTest((ctx, A) => { + ctx.register("a", A) + .dependencies("bee=b"); // dependencies specified here will take precedence + ctx.get("a").bee === ctx.get("b"); // true + }); +} + +module CreateYourOwn { + class Backbone { + history: History = new History(); + } + + class History { + start() {} + } + + doTest(ctx => { + ctx.register("history").object(new Backbone().history); + ctx.get("history").start(); // you can use it since it is already created and initialized + ctx.initialize(); // initialize the rest of the objects + }); +} diff --git a/di-lite/di-lite.d.ts b/di-lite/di-lite.d.ts new file mode 100644 index 000000000..356f70c7b --- /dev/null +++ b/di-lite/di-lite.d.ts @@ -0,0 +1,69 @@ +// Type definitions for di-lite 0.3.3 +// Project: https://github.com/NickQiZhu/di.js +// Definitions by: Timothy Morris +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module DiLite { + interface DiLiteStatic { + version: string; + createContext(): CreateContext; + dependencyExpression(depExp: string): string; + entry(name: string, ctx: CreateContext): any; + strategy: StrategyEnum; + factory: FactoryEnum; + utils: Utils; + } + + interface Dictionary { + [index: string]: T; + } + + interface CreateContext { + map: Dictionary; + entry(name: string): T; + register(name: string, service: T): Entry; + has(name: string): boolean; + get(name: string): any; + create(name: string, args: any): T; + initialize(): void; + clear(): void; + inject(name: string, o: T, dependencies: string): T; + ready(o: Function): T; + ready(o: any): T; + } + + interface Entry { + create(newArgs: any): Entry; + object(o: T): Entry; + object(): T; + strategy(s: Function): Entry; + strategy(): T; + type(t: T): Entry; + type(): T; + dependencies(d: T): Entry; + dependencies(): T; + args(a: T): Entry; + args(): T; + factory(f: Function): Entry; + factory(): T; + } + + interface StrategyEnum { + proto(name: string, object: TObject, type: TType, args: any, ctx: CreateContext, dependencies: any): TObject; + singleton(name: string, object: TObject, type: TType, args: any, ctx?: CreateContext, dependencies?: any): TObject; + } + + interface FactoryEnum { + constructor(type: T, args: any): T; + func(type: T, args: any): T; + } + + interface Utils { + invokeStmt(args: any, op: string): string; + } +} + +declare module "di-lite" { + export = di; +} +declare var di: DiLite.DiLiteStatic;