【问题标题】:Implementing (Abstract) Nameko Service Inheritance实现(抽象)Nameko 服务继承
【发布时间】:2019-10-06 16:03:14
【问题描述】:

我有一个处理大量实体的 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

所以这很好用,但方法对吗?尤其是依赖注入?

【问题讨论】:

    标签: nameko


    【解决方案1】:

    是的,这种方法效果很好。

    Nameko 直到运行时才内省服务类,因此它会看到任何标准 Python 类继承产生的结果。

    需要注意的一点是,您的基类不是“抽象的”——如果您将nameko run 指向app/customer/service.py,它将尝试运行它。相关,如果您将“具体”子类放在同一个模块中,nameko run 将尝试运行这两个。您可以通过指定服务类来缓解这种情况,即nameko run app.services:HTTPSalesService

    【讨论】:

    • 知道为什么 nameko 在上述情况下似乎运行 HTTPCustomerService 而不是 HttpSalesService 吗?
    • 是的。实际上,我在上面的陈述中是不正确的——您不必将两个类放在同一个模块中即可遇到此问题。服务检查还考虑您已导入的类,因此包含基类。缓解是一样的:调用runner时指定服务类的名字。
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2011-11-03
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多