Blog>
Snippets

Injection Token with Factory Provider

Explain how to use factory providers with an InjectionToken to dynamically create services.
import { InjectionToken, Provider } from '@angular/core';

// Define an InjectionToken for the service
export const MY_SERVICE_TOKEN = new InjectionToken('MyService');
This code snippet defines an injection token using the Angular InjectionToken API. The token is used to inject a service into components or other services without directly referencing the service class.
// The actual service you want to inject
class MyService {
  constructor(private config: any) {}
  // Service methods here
}

// Factory function that creates an instance of MyService
function myServiceFactory(config: any) {
  // Here you might have more complex logic for creating the service
  return new MyService(config);
}
This snippet defines a simple service class `MyService` and a factory function `myServiceFactory`. The factory function is responsible for creating an instance of `MyService` with some configuration.
// Assume we have some config object
const serviceConfig = { /* ... */ };

// Define the factory provider for the InjectionToken
const MY_SERVICE_PROVIDER: Provider = {
  provide: MY_SERVICE_TOKEN,
  useFactory: () => myServiceFactory(serviceConfig),
  // Add any dependencies the factory might need here
  // deps: [SomeOtherService]
};
This snippet contains the configuration object which will be passed to the service. It also creates a provider object using the previously defined InjectionToken and the factory function. The provider tells Angular's dependency injection system how to create the service.
import { NgModule } from '@angular/core';

@NgModule({
  providers: [
    MY_SERVICE_PROVIDER
    // Other providers here
  ]
  // Other module metadata properties here
})
export class MyModule {}
In this final snippet, we have an Angular module that declares the provider in its `providers` array. Including `MY_SERVICE_PROVIDER` here makes the service available to the rest of the application.