botox是一个基于python类型注释的依赖注入实现。
botox-di的Python项目详细描述
肉毒杆菌
botox injector是一个基于python类型注释的依赖注入实现。 它有助于交付已配置的功能对象,减少类与其依赖项之间的耦合。
分娩
全局变量?代理对象?应用程序上下文?
应该有一个(最好只有一个)明显的方法来做。
肉毒杆菌可以帮助你将一个类与不同的设计变更和缺陷隔离开来。 也就是说,不要考虑应用程序模块之间的相互依赖性 现在你会发现你不得不把时间花在一门课上,专注于它所设计的任务上。
配置
猴子修补?装修师?
显式比隐式好。
BOTX允许类具有可配置的灵活性。 类依赖于他期望的依赖接口。 对于不同的 需要不同依赖项实现的情况。
使用量
现在总比没有好。
肉毒杆菌不需要改变代码行为,它可以作为重构应用于遗留代码。
安装
使用pip:
安装和更新pip install -U botox-di
示例
类注入
可用于减少应用程序类中的样板代码,因为 初始化或设置依赖项的所有工作都是单独处理的。
frombotoximportInjectorclassPaymentService:...classBillingService:...classSalesService:def__init__(self,payment_service:PaymentService,billing_service:BillingService):self.payment_service=payment_serviceself.billing_service=billing_serviceinjector=Injector()injector.prepare(PaymentService)injector.prepare(BillingService)injector.prepare(SalesService)sales=injector.deliver(SalesService)assertisinstance(sales.payment_service,PaymentService)assertisinstance(sales.billing_service,BillingService)
结果是类,它更易于在中进行单元测试 使用模拟其他对象的存根或模拟对象进行隔离。
injector.prepare(PaymentService,PaymentServiceStub)
价值注入
当需要一个对象来协调整个系统中的操作时可以使用。
frombotoximportInjectorclassAppSettings:...settings=AppSettings()injector=Injector()injector.prepare(AppSettings,settings)assertinjector.deliver(AppSettings)issettings
lambda注射
可用于将旧代码中的代理对象包装为重构。
frombotoximportInjectorfromflaskimportgfromsqlalchemy.ormimportSessioninjector=Injector()injector.prepare(Session,lambda:g.session)
功能注入
可用于生成具有依赖项的工厂函数。
frombotoximportInjectordefcreate_api_client(settings:Settings):returnApiClient(settings.base_url,settings.key)injector=Injector()injector.prepare(Settings)injector.prepare(ApiClient,create_api_client)
顺序注射
可用于提供依赖项的集合。
classPaymentService(metaclass=ABCMeta):name:strclassGooglePayService(PaymentService):...classApplePayService(PaymentService):...classFlowService:def__init__(self,payment_services:List[PaymentService]):self.payment_services=payment_servicesdefget_available_payment_methods(self):forpayment_serviceinself.payment_services:yieldpayment_service.nameinjector=Injector()injector.prepare(GooglePayService)injector.prepare(ApplePayService)injector.prepare(List[PaymentService],[GooglePayService,ApplePayService])injector.prepare(FlowService)
芹菜
您可以定义不同的应用程序基任务类,以将依赖项传递到任务调用中。
fromceleryimportCelery,TaskfrombotoximportInjectorclassCalculator:defadd(self,x,y):returnx+yclassAppTask(Task):def__call__(self,*args,**kwargs):run=self.app.injector.inject(self.run,skip=len(args))returnrun(*args,**kwargs)app=Celery('tasks',broker='pyamqp://guest@localhost//',task_cls=AppTask)app.injector=Injector()app.injector.prepare(Calculator)@app.taskdefadd(x,y,calculator:Calculator):returncalculator.add(x,y)
艾奥赫特普
您可以使用中间件将依赖项传递到请求处理程序中。也支持异步函数。
fromaiohttpimportwebfrombotoximportInjectorclassHelloService:defget_hello_message(self,name):returnf'Hello, {name}!'asyncdefhandle(request,service:HelloService):name=request.match_info.get('name','Anonymous')text=service.get_hello_message(name)returnweb.Response(text=text)@web.middlewareasyncdefdependency_injection(request,handler):handler=request.app.injector.inject(handler,skip=1)returnawaithandler(request)app=web.Application(middlewares=[dependency_injection])app.injector=Injector()app.injector.prepare(HelloService)app.add_routes([web.get('/',handle),web.get('/{name}',handle)])web.run_app(app)