Service Locator

The ServiceLocator pattern provides a globally accessible registry for managing shared services or dependencies.

It allows components to register and retrieve services without needing direct references or constructor-based injection.

This pattern is useful in small to mid-size applications, plugin-based systems, or when decoupling setup logic from core business logic.

Overview

Services can be:

  • Registered with ServiceLocator.register(“key”, service)

  • Retrieved with either:

    • ServiceLocator.get(“key”)

    • ServiceLocator[“key”]

  • Unregistered with ServiceLocator.unregister(“key”)

  • Checked with either:

    • ServiceLocator.has(“key”)

    • “key” in ServiceLocator

You can also inspect the currently registered services by printing the class:

class ConsoleLogger:
    def log(self, msg): print(msg)

class FileLogger:
    def __init__(self, path): self.path = path

class MySQLDatabase:
    def connect(self): ...

ServiceLocator.register("Loggers", [ConsoleLogger(), FileLogger("logs.txt")])
ServiceLocator.register("Database", MySQLDatabase())

print(ServiceLocator)

# Output:
# Registered services:
# Database: object of type MySQLDatabase
# Loggers:
#   - object of type ConsoleLogger
#   - object of type FileLogger

Note

This approach introduces a form of global state. While convenient, it should be used with care in larger systems, as it can obscure true dependencies.

Example Usage

from pattern_kit import ServiceLocator

class Logger:
    def log(self, msg):
        print(f"[LOG] {msg}")

ServiceLocator.register("logger", Logger())

logger = ServiceLocator["logger"]
logger.log("Ready to go!")

if "logger" in ServiceLocator:
    ServiceLocator.unregister("logger")

API Reference

class pattern_kit.architectural.service_locator.ServiceLocator[source]

Bases: object

A simple Service Locator pattern implementation.

This class acts as a global registry for services or dependencies. It allows you to register, retrieve, and unregister services by key or type.

classmethod clear() None[source]

Remove all registered services.

classmethod get(key: str) Any[source]

Retrieve a service by name/key.

classmethod has(key: str) bool[source]

Check if a service is registered.

classmethod register(key: str, service: Any) None[source]

Register a service by name/key.

registered: Dict[str, Any] = {}
classmethod unregister(key: str) None[source]

Unregister a service by name/key.