pyqt_reactive.services.service_registry

Service registry for decoupled component lookup.

Provides a central registry where components can register themselves and other components can look them up by interface/type. This decouples UI layout from service discovery, preventing breakage when widgets are moved.

Example

# Automatic registration via mixin class MyWidget(QWidget, AutoRegisterServiceMixin):

SERVICE_TYPE = MyWidget # Register as this type

# Lookup anywhere widget = ServiceRegistry.get(MyWidget)

Classes

AutoRegisterServiceMixin(*args, **kwargs)

Mixin for widgets that auto-register with ServiceRegistry.

ServiceRegistry()

Central registry for application services/components.

class pyqt_reactive.services.service_registry.ServiceRegistry[source]

Central registry for application services/components.

Decouples service consumers from service providers by allowing registration and lookup by type/interface rather than widget hierarchy.

classmethod register(service_type: Type[T], instance: T) None[source]

Register a service instance for a given type.

Parameters:
  • service_type – The type/interface to register under

  • instance – The service instance

classmethod get(service_type: Type[T]) T | None[source]

Get a registered service by type.

Parameters:

service_type – The type/interface to look up

Returns:

The registered instance, or None if not found

classmethod unregister(service_type: Type) None[source]

Unregister a service.

Parameters:

service_type – The type to unregister

classmethod clear() None[source]

Clear all registered services. Useful for testing.

class pyqt_reactive.services.service_registry.AutoRegisterServiceMixin(*args, **kwargs)[source]

Mixin for widgets that auto-register with ServiceRegistry.

Widgets inherit from this mixin to automatically register themselves when created and unregister when destroyed. By default, concrete classes register using their own class type (type(self)).

Example

class MyWidget(QWidget, AutoRegisterServiceMixin):

# Auto-registers as MyWidget - no SERVICE_TYPE needed! pass

To customize the registration type (e.g., register as an interface):
class MyWidget(QWidget, AutoRegisterServiceMixin):

SERVICE_TYPE = IMyInterface # Register under interface type

To disable auto-registration (for abstract base classes):
class AbstractWidget(QWidget, AutoRegisterServiceMixin):

SERVICE_TYPE = None # Won’t auto-register

SERVICE_TYPE: Type | None = Ellipsis

The type to register as.

  • If … (Ellipsis, default): Uses type(self) - concrete class auto-registers

  • If a Type: Registers as that specific type (useful for interfaces)

  • If None: Disables auto-registration (useful for abstract base classes)

__init__(*args, **kwargs)[source]
closeEvent(event)[source]

Unregister when widget is closed.