超级简单依赖注入器
ssdi的Python项目详细描述
SSDI(超级简单依赖注入器)
ssdi是一个非常简单的类,它使用python 3类型注释来提供简单的依赖注入。 它提供了一个注入器类,该类根据类型自动解析依赖关系。 它与基类和抽象基类一起工作。
如果是同一类型的多个,它将选择第一个添加的类型。
顾名思义,这是一个非常简单的注射器!
要求
由于类使用类型注释,因此需要使用python 3
对如何编写类有进一步的要求。这将在用法和示例中介绍。
安装
PIP安装
pip install ssdi
或
python -m pip install ssdi
用法
使用ssdi有一些简单的要求:
- 参数必须使用类型批注
- 给定的命名参数不能与要注入的类同名
- 喷油器中不能有多个类型
- 可以告诉truth,但随后将只使用第一个呈现的类。
下面是一个使用injector类的简单示例。 显示您可以将参数和命名参数传递给类。
有关更真实的示例,请参见本文档的examples部分。
fromssdiimportInjectorclassBaseClass():deflogic(self)->None:print("BaseClass logic")passclassChildClass(BaseClass):def__init__(self,param:int)self.param=paramdeflogic(self)->None:super().logic()print("ChildClass logic: ",self.param)passclassOtherClass():def__init__(self,param:int,some_class:BaseClass,named_param:str="foo")->None:self.some_class=some_classself.param=paramself.named_param=named_paramdeflogic(self)->None:self.some_class.logic()print("OtherClass logic: ",self.param,self.named_param)if__name__=="__main__":injector=Injector()injector.add(ChildClass,123)injector.add(OtherClass,456,named_param="bar")other_class=injector.get(OtherClass)other_class.logic()
输出:
BaseClass logic
ChildClass logic 123
OtherClass logic 456 bar
示例
日志类
假设你有一个更大的应用程序。为此,您已经实现了自定义日志逻辑。为此,您有一个日志对象,可以为其提供各种类的实例。首先,使用print语句登录到stdout。
几个月后,您发现需要登录到数据库。这需要新的逻辑。 现在,不要替换testlogger的所有实例,而是使用ssdi,只需要替换一次,在这里您已经给了Injector类。 其余的类实例化-所有100个业务逻辑类-现在将自动用新的databaselogger类实例化,从而节省时间并减少出现错误的机会。
首先,我们定义了记录器:
文件logger.py
importABCclassLogger(ABC.abc):@abstractmethoddeflog(message:str)->None:""" This functions implementation will log a message """passclassTestLogger(Logger):deflog(message:str)->None:""" This function logs to a debug interface, f.x. to stdout """print(message)classDatabaseLogger(Logger):deflog(message:str)->None:""" This function logs to a database """# Logic to log to databasepass
那么我们就有了所有的业务逻辑:
文件business.py
fromloggerimportLoggerclassBusinessLogicOne():def__init__(self,logger:Logger)->None:self.logger=loggerdeflogic(self):self.logger.log("Some log message")classBusinessLogicTwo():def__init__(self,logger:Logger)->None:self.logger=loggerdeflogic(self):self.logger.log("Some log message")classBusinessLogicN():def__init__(self,logger:Logger)->None:self.logger=loggerdeflogic(self):self.logger.log("Some log message")
最后我们有一个使用ssdi的类。请注意,无论有多少类使用logger类实例化,我们在实现数据库记录器时仍然只需要在一个地方更改它。看看您是否可以更改下面的代码以使用新的记录器-承诺它确实是super simple。
文件main.py
fromssdiimportInjectorfrombusinessimport*fromloggerimport*if__name__=="__main__":injector=Injector()injector.add(BusinessLogicOne)injector.add(BusinessLogicTwo)injector.add(BusinessLogicN)injector.add(TestLogger)business_logic_one=injector.get(BusinessLogicOne)business_logic_one.logic()business_logic_two=injector.get(BusinessLogicTwo)business_logic_two.logic()business_logic_n=injector.get(BusinessLogicN)business_logic_n.logic()
测试
已经创建了几个单元测试。创建这些文件是为了使用pytest进行测试。请参阅github(https://github.com/Dadeerh/ssdi)上的test_injector.py文件以了解所有测试。
联系人
对github(https://github.com/Dadeerh/ssdi)的评论或发送电子邮件到dadeerh91@gmail.com