超级简单依赖注入器

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

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

推荐PyPI第三方库


热门话题
由于测试失败,java testcontainers maven构建失败   java实现jacobi算法实现laplace方程   java中的多线程:如何在不等待所有线程使用ExecutorService完成任务的情况下终止所有线程的执行?   java Hello World不在Android Studio 3中工作   ubuntu Tomcat7的Java版本不正确   java Javafx内存泄漏   对于手动实现的Spring数据存储库方法,我应该使用Java8默认方法吗?   googleappengine中的java添加过滤查询   html当使用JSOUP库在Java中读取标签时,如何保留标签(如<br>、<ul>、<li>、<p>等)的含义?   编码为什么jasper生成的报告在Java中不显示西里尔语(保加利亚语)?   java有没有办法隐藏当前位置和jdk动作?   java找出编译原型文件的版本   有没有办法在运行时更改java方法的访问修饰符?   语法字符串。。。Java中的参数   java数组元素在添加其他元素时会相互覆盖   eclipse中的java GWT项目   java如何为spring rest模板请求将动态json属性名映射到jackson   java无法在Windows 10上找到特定的JDK   在xml字符串和java字符串之间提取正则表达式子字符串