Skip to content

ioc

Description

Inversion of Control container.

Import

import {
context,
iocParam,
IocClass
} from "dreamkit";

Definition

declare const context: {
register(
key: any,
data: {
value?: any;
useClass?: any;
useFactory?: ($context: typeof context, key: any) => any;
singleton?: boolean;
},
): typeof context;
unregister(key: any): typeof context;
resolve(key: any): unknown;
fork(): typeof context;
};

Examples

Basic usage

import { $route, context, IocClass } from "dreamkit";
abstract class ThirdModel {
abstract fetch(): string;
}
class MyModel extends IocClass({ ThirdModel }) {
fetch() {
return this.thirdModel.fetch();
}
}
export default $route.path("/").create(() => {
class ThirdModelImpl extends ThirdModel {
override fetch() {
return "resolved";
}
}
const manualModel = new MyModel({ thirdModel: new ThirdModelImpl() });
const autoModel = context
.fork()
.register(ThirdModel, { value: new ThirdModelImpl() })
.resolve(MyModel);
return (
<>
<p>{manualModel.fetch()}</p>
<p>{autoModel.fetch()}</p>
</>
);
});

Optional

import { context, IocClass, iocParam, ServiceClass } from "dreamkit";
class StringModel {
toUpperCase(value: string) {
return value.toUpperCase();
}
}
class MyModel extends IocClass({
string: iocParam(StringModel).optional(),
}) {
toUpperCase(value: string) {
return this.string?.toUpperCase(value);
}
}
export class MyService extends ServiceClass({}) {
onStart() {
const model1 = new MyModel({});
const model2 = new MyModel({
string: {
toUpperCase(value) {
return value.toUpperCase();
},
},
});
const model3 = context
.fork()
.register(StringModel, { useFactory: () => new StringModel() })
.resolve(MyModel);
console.log({
model1: model1.toUpperCase("text"), // undefined
model2: model2.toUpperCase("text"), // "TEXT"
model3: model3.toUpperCase("text"), // "TEXT"
});
}
}