Blog>
Snippets

Creating a Plugin Registry Service in Angular

Develop a service that acts as a registry for plugins, allowing them to be registered and retrieved by name or type.
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class PluginRegistryService {
  private plugins = new Map<string, any>();

  // Method to register a plugin by providing a name and the plugin itself
  registerPlugin(pluginName: string, plugin: any): void {
    if (this.plugins.has(pluginName)) {
      console.warn(`A plugin with the name ${pluginName} is already registered.`);
      return;
    }
    this.plugins.set(pluginName, plugin);
  }

  // Method to get a plugin by its name
  getPlugin(pluginName: string): any {
    return this.plugins.get(pluginName);
  }

  // Method to get all plugins of a specific type
  getPluginsByType<T>(type: { new(...args: any[]): T }): T[] {
    return Array.from(this.plugins.values())
      .filter(plugin => plugin instanceof type);
  }
}
This is an Angular service named PluginRegistryService. It maintains a registry of plugins using a Map object. It includes the registerPlugin method for registering plugins with a unique name, the getPlugin method for retrieving a plugin by its name, and the getPluginsByType method that filters and returns all registered plugins of a specified type.