实现(抽象)Nameko服务继承

时间:2019-05-20 09:46:54

标签: nameko

我有一个nameko服务,该服务处理大量实体,并且将入口点放在单个service.py模块中会使该模块非常不可读且难以维护。

因此,我决定将模块分成多个服务,然后将其用于扩展主服务。我有点担心依赖注入,并认为像db这样的依赖可能由于这种方法而具有多个实例。这是我到目前为止的内容:

具有所有与客户相关的端点的客户服务模块

# 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

所以这很好用,但是这种方法正确吗?尤其是在依赖注入方面?

1 个答案:

答案 0 :(得分:1)

是的,这种方法很好用。

Nameko直到运行时才对服务类进行自省,因此它可以看到产生的任何标准Python类继承。

要注意的一件事是您的基类不是“抽象”的-如果将nameko run指向app/customer/service.py,它将尝试运行它。相关的是,如果将“具体的”子类放在同一模块中,nameko run将尝试同时运行它们。您可以通过指定服务类别(即nameko run app.services:HTTPSalesService

来缓解这种情况)