死的简单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)