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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java例外。Lang.Stringindexoutofboundsexception索引超出范围(0)   java Spring引导Freemarker从2.2.0升级失败   重构Java反模式名称?包含对象的对象包含。。。等   用java处理JDBC可能出现的死锁的最佳方法   java无法访问主线程上的数据库,因为它可能会在很长一段时间内锁定UI   java如何将固定大小的画布包装在边框窗格中的滚动窗格居中?   java解析xsd文件后得到空结果   在html页面中表示XML文件的java   socketjava对象流   sql Java越界异常数据库   JavaJBoss7.1.1不会在Mavericks上启动   Twincat ADS事件驱动读取在一段时间后停止工作(Java)   java MyBatis使用生成的ID插入所有   Mojave上缺少MacOS Java控制面板   JavaGuice:如果多次注入相同的依赖项,是否注入了该依赖项的相同实例?