python的命令总线/消息总线实现
troop的Python项目详细描述
特鲁比
python的命令总线库。使在应用程序中使用消息总线模式变得容易。在
什么是命令/消息?在
命令是对象,是某种命令式的命令,用于通知客户端对应用程序的期望行为。 命令可以承载完成任务所需的一些信息(客户端的输入)。建议使用数据类 当你为了自己的方便而宣布命令时。在
什么是命令处理程序?在
命令处理程序是一个函数或可调用对象,它接受命令作为执行特定任务的参数。在
使用命令总线/消息总线的优点
- 命令可以由您的客户机在任何时间/任何地方创建,只要它被移交给命令总线,它就会被处理
- 您可以精简服务层和依赖关系,因为每个处理程序都执行一个特定的任务
- 测试应用程序可以更精确、更容易
特点
- 快速简单
- 灵活的解决方案,可在任何地方使用
- 与数据类配合良好
- 命令处理程序的自定义工厂
安装
pip install troopy
基本用途
^{pr2}$HelloHandler
是封装业务逻辑的类(在这个场景中欢迎用户),任何可调用的都可以使用
作为命令处理程序,只要它是没有__init__
方法的函数或类声明。在
SayHello
是一个命令类,它携带一些用@attach
修饰符附加到HelloHandler
的数据。
@attach
decorator允许库理解哪个处理程序负责哪个命令。这也是可能的
直接使用troopy.MessageRouter
将命令附加到其处理程序(example available here)
上述示例将打印Hello user Tom
。在
为命令处理程序设置工厂
可以使用自定义函数分解命令处理程序,请考虑以下示例:
importsqlite3fromtroopyimportCommandBus,commandfromdataclassesimportdataclassdb=sqlite3.connect('example.db')classUserRegistrationHandler:def__init__(self,db):self.db=dbdef__call__(self,command:"RegisterUser")->None:cursor=self.db.cursor()cursor.execute("INSER INTO users VALUES (?, ?)",(command.username,command.password))self.db.commit()@command(UserRegistrationHandler)# attach command to its handler@dataclassclassRegisterUser:username:strpassword:strdefcommand_handler_factory(cls):returncls(db)command_bus=CommandBus(handler_factory=command_handler_factory)command_bus.dispatch(RegisterUser(username="Tom",password="secret"))
正如您可能知道的那样,UserRegistrationHandler
需要sqlite数据库连接才能正常工作,command_handler_factory
我们能够提供到对象的连接,因此RegisterUser
命令可以正确处理。在
有关更多示例,请检查examples目录
- 项目
标签: