【问题标题】:Thoughts on passing HttpRequest and HttpResponse to service layer?关于将 HttpRequest 和 HttpResponse 传递给服务层的想法?
【发布时间】:2011-07-08 13:30:36
【问题描述】:

我有一个 CommerceService 模块来帮助处理常见的订单功能,其中包括通过 Authorize.net、Paypal 和 Google Checkout 等提供商的付款授权等功能。它提供了一个简单的接口,例如 placeOrder(Order) 并完成繁重的工作。

本地支付提供商的操作很简单,但 Paypal 和 Google 提供远程支付服务,因此以 Paypal 为例,用户可以离开您的网站,在那里付款,Paypal 将发送 Http 通知以连接您的订单流程.

我的问题是处理这些通知。理想情况下,将 HttpRequest 对象传递给服务层并让服务使用 handleRemoteOrder(Request, Response) 来完成订单是最简单的,而不是强迫前端担心任何这些。但是将请求和响应传递给服务层在直觉上似乎是错误的。

我曾考虑将请求参数提取到 Map 并简单地传递它,但 google checkout java sdk 明确地在请求和响应对象上工作,因此不使用 sdk 来解决这个问题会很麻烦。

这么远传递 HttpRequest 是否令人不悦?如果是这样,是否应该有前端逻辑来处理这个问题?或者这是一个毫无根据的担心,我不应该考虑这么多?

【问题讨论】:

  • 有什么大不了的?把事情简单化。以简单的名义引入了多少复杂性?

标签: java architecture servlets paypal-ipn


【解决方案1】:

HttpRequestHttpResponse 包装在实现接口的类中,并使服务层依赖于接口。对于 Google 以外的其他服务,您可以使用请求参数传递地图,而对于 Google,您可以使用包装器实现。无论如何,服务层不会知道背后是什么。

【讨论】:

    【解决方案2】:

    HttpServletRequest 不应传递给服务层。

    如果您明确需要请求,您可以将逻辑放在 Web 层中。或者扩展库并允许它采用Map 参数(如果可能)

    【讨论】:

      【解决方案3】:

      您没有理由不能将您的 Commerce 模块跨越多个层。将其视为例如UML 调用子系统。这样您的 CommerceSBS 包含多个组件,例如:

      1. CommerceRequestMgr;控制与 PSP 的对话(生成指向 PSP 的链接和回调链接)
      2. 商务回调;可能是等待 PSP 回调的侦听器 servlet
      3. 商务服务;实现后端逻辑,例如数据库或 ERP 访问权限

      这就是我过去所做的......

      【讨论】:

      • +1 非常正确 - 没有理由你不能。我想问题是你是否应该这样做。
      【解决方案4】:

      我同意 Bozho 和 Boris 的观点,即服务层不应该“知道”HttpR*。

      要考虑的另一种方法是放置一个适配器(位于外部服务和您的 SL 之间)。这使您可以保持 SL 清除不需要的依赖项,并且适配器使您可以灵活地在必要时与外部系统很好地集成;并且因为适配器是隔离的并且只有一项特定的工作要做,所以它是一种灵活的低风险选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        相关资源
        最近更新 更多