死的简单python服务定位器

service-locator的Python项目详细描述


  • 服务定位器模式是一个非常简单但有用的模式,它可以帮助您从应用程序代码中删除粘合代码。
  • 分离依赖项的连接(粘合代码)可以显著减少代码行,并鼓励松耦合。
  • 这允许您依赖于抽象而不是具体化,这使得添加 应用程序的功能要简单得多
  • 配置XML文件不是pythonic文件,通常会过度复杂,而是使用类装饰器。
  • 具体的服务实现应该放在服务文件夹中所有服务子文件夹都将使用 discover_services函数和所有包含的模块都将自动加载。
  • 所有服务都将被服务定位器实例化为一个单例

用法

有关示例项目,请参见test/integration/test.py假设您有一个抽象服务类,如下所示:

#mime_recognizer_service.pyclassMIMERecognizerService(object):defrecognizes_extension(self,extension):passdefget_MIME_type(self):pass

注册这样的服务:

#pdf_recognizer.pyfromservicelocator.service_discovererimportdiscover_services@service_provider(MIMERecognizerService)classPDFRecognizer(MIMERecognizerService):defrecognizes_extension(self,extension):returnextension==".pdf"defget_MIME_type(self):return"application/pdf"

您可以注册任意数量的服务和服务提供商。当您使用 lookup_all函数,列表中的结果之一将是pdfRecogener()实例。

为了使服务发现过程能够找到pdfRecogener,您需要将其放在服务文件夹中你的 目录结构可能如下所示(出于演示目的,删除了\uu init\uuu.py):

-root/
    -main.py
    -mime_recognizers/
       -mime_recognizer_service.py
       -services/
           -pdf_recognizer.py
    -file_openers/
       -file_opener_service.py
       -services/
           -pdf_opener.py

您将发现这样的服务:

fromservicelocator.service_discovererimportdiscover_servicesdiscover_services()

就这样discover_服务将遍历项目目录树并导入服务文件夹中的所有python模块

要检索服务的服务提供者,请使用以下查找功能:

fromservicelocator.lookupimportglobal_lookupMIMERecognizers=global_lookup.lookup_all(MIMERecognizerService)

这将获得MimereCognizerService的所有具体实现,但我们不需要知道 任何这些具体实现的存在。添加额外的功能就像在 服务目录,不需要额外的代码。这使得以松散耦合的方式添加新的服务提供者变得非常容易

如果您知道只有一个服务实现:

fromservicelocator.lookupimportglobal_lookupMIMERecognizer=global_lookup.lookup(MIMERecognizerService)

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

推荐PyPI第三方库


热门话题
算法根据Java中传递的参数定义数据类型   java将图像文件存储在Google云存储桶中后,显示大小为“0字节”的所有文件列表   swing Java表模型删除Bounds 1的行排列   java中表上的for循环基本迭代   带有Http请求和UTF8的java下载文件   java滞后于setImageDrawable   java如何使用println按单位打印同一列中的数字列表?   中文Windows版本的Java默认编码   java编程项目,ADT列表   无法识别java消息部分MyClass。(它是否存在于服务WSDL中?)   java从IJavaProject或IProject获取到org。阿帕奇。专家模型模型   如何使用枚举(如java类变量)实现运行时同态?   使用集合对特定于Java的练习进行排序。分类   调试如何调试已作为exe文件运行的java应用程序?   java如何将带有模块的项目导入到另一个项目中,而不丢失封装?