@@ -31,6 +31,31 @@ def setup_mediator(
3131 middlewares : typing .Iterable [mediator_middlewares .Middleware ],
3232 events_mapper : typing .Callable [[events .EventMap ], None ] | None = None ,
3333) -> cqrs .EventMediator :
34+ """
35+ Create an event mediator with the given container and middlewares.
36+
37+ Args:
38+ container: DI container (e.g. :class:`cqrs.container.di.DIContainer`) or
39+ any implementation of :class:`cqrs.container.protocol.Container`.
40+ middlewares: Middleware chain for the mediator (e.g. logging).
41+ events_mapper: Optional callable that receives an :class:`~cqrs.events.map.EventMap`
42+ and binds event types to handler types via :meth:`~cqrs.events.map.EventMap.bind`.
43+
44+ Returns:
45+ Configured :class:`cqrs.EventMediator` instance.
46+
47+ Example::
48+
49+ def bind_events(event_map: events.EventMap) -> None:
50+ event_map.bind(OrderCreatedEvent, OrderCreatedEventHandler)
51+
52+ mediator = setup_mediator(
53+ container=di_container,
54+ middlewares=[logging_middleware.LoggingMiddleware()],
55+ events_mapper=bind_events,
56+ )
57+ await mediator.emit(OrderCreatedEvent(order_id="1"))
58+ """
3459 _events_mapper = events .EventMap ()
3560 if events_mapper is not None :
3661 events_mapper (_events_mapper )
@@ -71,6 +96,34 @@ def bootstrap(
7196 events_mapper : typing .Callable [[events .EventMap ], None ] | None = None ,
7297 on_startup : typing .List [typing .Callable [[], None ]] | None = None ,
7398) -> cqrs .EventMediator :
99+ """
100+ Bootstrap an event mediator with optional middlewares and event bindings.
101+
102+ If ``di_container`` is a :class:`di.Container`, it is wrapped in
103+ :class:`cqrs.container.di.DIContainer`. Logging middleware is appended
104+ to the middleware list. Runs all ``on_startup`` callables before setup.
105+
106+ Args:
107+ di_container: DI container from the ``di`` package or a CQRS container.
108+ middlewares: Optional list of middlewares (e.g. logging, metrics).
109+ events_mapper: Optional callable that receives an :class:`~cqrs.events.map.EventMap`
110+ and binds event types to handler types.
111+ on_startup: Optional list of callables to run before creating the mediator.
112+
113+ Returns:
114+ Configured :class:`cqrs.EventMediator` with logging middleware enabled.
115+
116+ Example::
117+
118+ def bind_events(event_map: events.EventMap) -> None:
119+ event_map.bind(OrderCreatedEvent, OrderCreatedEventHandler)
120+
121+ mediator = bootstrap(
122+ di_container=di.Container(),
123+ events_mapper=bind_events,
124+ )
125+ await mediator.emit(OrderCreatedEvent(order_id="1"))
126+ """
74127 if on_startup is None :
75128 on_startup = []
76129
@@ -90,8 +143,10 @@ def bootstrap(
90143 middlewares_list : typing .List [mediator_middlewares .Middleware ] = list (
91144 middlewares or [],
92145 )
146+ if not any (isinstance (m , logging_middleware .LoggingMiddleware ) for m in middlewares_list ):
147+ middlewares_list .append (logging_middleware .LoggingMiddleware ())
93148 return setup_mediator (
94149 container ,
95150 events_mapper = events_mapper ,
96- middlewares = middlewares_list + [ logging_middleware . LoggingMiddleware ()] ,
151+ middlewares = middlewares_list ,
97152 )
0 commit comments