This is an async implementation of Mediator pattern with pipline behaviors.
It is a port of Mediatr from .Net C#
Requirements:
- Python >= 3.5
install mediatr:
pip install mediatr
class GetArrayQuery():
def __init__(self,items_count:int):
self.items_count = items_count
import Mediator from mediatr
@Mediator.handler
async def get_array_handler(request:GetArrayQuery):
items = list()
for i in range(0, request.items_count):
items.append(i)
return items
# or just Mediator.register_handler(get_array_handler)
or class:
@Mediator.handler
class GetArrayQueryHandler():
def handle(self,request:GetArrayQuery):
items = list()
for i in range(0, request.items_count):
items.append(i)
return items
# or just Mediator.register_handler(GetArrayQueryHandler)
import Mediator from mediatr
mediator = Mediator()
request = GetArrayQuery(5)
result = await mediator.send_async(request)
# result = mediator.send(request) in synchronous mode
print(result) // [0,1,2,3,4]
You can define behavior class with method 'handle' or function:
@Mediator.behavior
async def get_array_query_behavior(request:GetArrayQuery,next): #behavior only for GetArrayQuery or derived classes
array1 = await next()
array1.append(5)
return array1
@Mediator.behavior
def common_behavior(request:object,next): #behavior for all requests because issubclass(GetArrayQuery,object)==True
request.timestamp = '123'
return next()
# ...
mediator = Mediator()
request = GetArrayQuery(5)
result = await mediator.send_async(request)
print(result) // [0,1,2,3,4,5]
print(request.timestamp) // '123'
For example, if you want to instantiate them with dependency injector or custom
def my_class_handler_manager(handler_class,is_behavior=False):
return handler_class()
mediator = Mediator(handler_class_manager=my_class_handler_manager)
PS:
The 'next' function in behavior is async
, so if you want to take results or if your behavior is async, use middle_results = await next()
Handler may be async too, if you need.