实现(抽象的)Nameko 服务继承
Implementing (Abstract) Nameko Service Inheritance
我有一个处理大量实体的 nameko 服务,将入口点放在单个 service.py
模块中会使模块变得非常不可读且更难维护。
所以我决定将模块拆分为多个服务,然后用于扩展主要服务。我有点担心依赖注入,并认为像数据库这样的依赖可能由于这种方法而有多个实例。这是我目前所拥有的:
具有所有客户相关端点的客户服务模块
# app/customer/service.py
class HTTPCustomerService:
"""HTTP endpoints for customer module"""
name = "http_customer_service"
db = None
context = None
dispatch = None
@http("GET,POST", "/customers")
def customer_listing(self, request):
session = self.db.get_session()
return CustomerListController.as_view(session, request)
@http("GET,PUT,DELETE", "/customers/<uuid:pk>")
def customer_detail(self, request, pk):
session = self.db.get_session()
return CustomerDetailController.as_view(session, request, pk)
和继承自客户服务的主要服务模块,可能还有其他抽象服务
# app/service.py
class HTTPSalesService(HTTPCustomerService):
"""Nameko http service."""
name = "http_sales_service"
db = Database(Base)
context = ContextData()
dispatch = EventDispatcher()
最后我 运行 它是:
nameko run app.service
这么说效果不错,但是这个方法对吗?特别是关于依赖注入?
是的,这种方法很有效。
Nameko 在 run-time 之前不会自省服务 class,因此它会看到任何标准 Python class 继承产生的结果。
需要注意的一件事是你的基础 class 不是 "abstract" -- 如果你将 nameko run
指向 app/customer/service.py
它会尝试 运行它。相关的,如果你把你的 "concrete" subclass 放在同一个模块中,nameko run
会尝试 运行 两个 。您可以通过指定服务 class 来缓解这种情况,即 nameko run app.services:HTTPSalesService
我有一个处理大量实体的 nameko 服务,将入口点放在单个 service.py
模块中会使模块变得非常不可读且更难维护。
所以我决定将模块拆分为多个服务,然后用于扩展主要服务。我有点担心依赖注入,并认为像数据库这样的依赖可能由于这种方法而有多个实例。这是我目前所拥有的:
具有所有客户相关端点的客户服务模块
# app/customer/service.py
class HTTPCustomerService:
"""HTTP endpoints for customer module"""
name = "http_customer_service"
db = None
context = None
dispatch = None
@http("GET,POST", "/customers")
def customer_listing(self, request):
session = self.db.get_session()
return CustomerListController.as_view(session, request)
@http("GET,PUT,DELETE", "/customers/<uuid:pk>")
def customer_detail(self, request, pk):
session = self.db.get_session()
return CustomerDetailController.as_view(session, request, pk)
和继承自客户服务的主要服务模块,可能还有其他抽象服务
# app/service.py
class HTTPSalesService(HTTPCustomerService):
"""Nameko http service."""
name = "http_sales_service"
db = Database(Base)
context = ContextData()
dispatch = EventDispatcher()
最后我 运行 它是:
nameko run app.service
这么说效果不错,但是这个方法对吗?特别是关于依赖注入?
是的,这种方法很有效。
Nameko 在 run-time 之前不会自省服务 class,因此它会看到任何标准 Python class 继承产生的结果。
需要注意的一件事是你的基础 class 不是 "abstract" -- 如果你将 nameko run
指向 app/customer/service.py
它会尝试 运行它。相关的,如果你把你的 "concrete" subclass 放在同一个模块中,nameko run
会尝试 运行 两个 。您可以通过指定服务 class 来缓解这种情况,即 nameko run app.services:HTTPSalesService