Skip to main content

Providers

Providers are responsible to configure and resolve the value registered in the container. The following types of providers are available out-of-the-box:

  • ClassProvider
  • ValueProvider
  • FactoryProvider

For the most part, because they are defined according to the way you register some value in the container, the use of providers will be transparent to you.

ClassProvider

This provider is used to instantiate and inject all dependencies a class needs. It is able to inject both constructor dependencies and property dependencies.

import { Microinjection } from "@microkits/microinjection";

const container = Microinjection.getDefaultContainer();

class OrderRepository {
// ...
}

class OrderService {
private readonly repository: OrderRepository
// ...
}

container.register("OrderRepository").asClass(OrderRepository);

container.register("OrderService").asClass(OrderService, {
properties: [{
name: "repository",
inject: "OrderRepository"
}]
});

You can also specify that a constructor property or dependency is not required, that way the resolution will not fail if the dependency cannot be resolved at runtime

ValueProvider

This provider is useful for registering constants, or things that have a already been instantiated in a particular way.

import { Microinjection } from "@microkits/microinjection";

const container = Microinjection.getDefaultContainer();

container.register("release year").asValue(2022);

FactoryProvider

This provider allows you to register your own factory. The factory has access to the ResolutionContext and must return a value:

type Factory<T> = (context: ResolutionContext) => T;
import { Microinjection } from "@microkits/microinjection";

const container = Microinjection.getDefaultContainer();

container.register("user").asFactory((context) => {
return new User();
});

Custom Providers

It is possible to create your own Provider, extending the AbstractProvider abstract class.

export abstract class AbstractProvider<T> {
abstract resolve(context: ResolutionContext): T;
}
class HelloProvider extends AbstractProvider<string> {
private readonly name: string;

constructor(name: string) {
this.name = name;
}

resolve(context: ResolutionContext): T {
return `Hello ${this.name}!`;
}
}

container.register("hello").asProvider(
new HelloProvider("Microinjection")
);

console.log(container.resolve("hello"))
// "Hello Microinjection!"