-
Notifications
You must be signed in to change notification settings - Fork 2
/
boot.py
49 lines (45 loc) · 1.47 KB
/
boot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import inspect
from dilution_db import DilutionDB
from main.services.messagebus import Message, MessageBus
from main.services import handlers, unit_of_work
from main.adapters import orm
from main.configs import GlobalConfig, cnf
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
def bootstrap_dilution_db(
start_orm=True,
config: GlobalConfig = cnf,
uow: unit_of_work.AbstractUnitOfWork = None,
) -> DilutionDB:
if uow is None:
session_factory = sessionmaker(
bind=create_engine(config.DILUTION_DB_CONNECTION_STRING),
expire_on_commit=False
)
uow = unit_of_work.SqlAlchemyCompanyUnitOfWork(
session_factory=session_factory
)
if start_orm is True:
orm.start_mappers()
dependencies = {"uow": uow}
injected_command_handlers = {
command_type: inject_dependencies(handler, dependencies)
for command_type, handler in handlers.COMMAND_HANDLERS.items()
}
message_bus = MessageBus(
uow=uow,
command_handlers=injected_command_handlers)
dilution_db = DilutionDB(
config=config,
uow=uow,
message_bus=message_bus
)
return dilution_db
def inject_dependencies(handler, dependencies):
params = inspect.signature(handler).parameters
deps = {
name: dependency
for name, dependency in dependencies.items()
if name in params
}
return lambda message: handler(message, **deps)