【问题标题】:Could a method in the service class (layer) call another method in the same service?服务类(层)中的方法可以调用同一服务中的另一个方法吗?
【发布时间】:2018-06-09 04:30:28
【问题描述】:

就这是否违反 SOA 中的服务层设计原则寻求建议。我的设计很简单-Endpoint -> Service -> Repository。服务层返回一个 DTO 到端点,该端点被翻译成响应对象。

目前我的端点和服务层合同如下

端点

public interface Order {

     OrderInfoResponse getOrderInfo(String orderId);

     OrderStatusResponse isOrderComplete(String orderId);
}

服务

public interface OrderService {

    OrderDTO getOrder(String orderId);

    boolean getOrderStatus(String orderId);
}

现在在我的实现中,getOrderStatusService 方法调用getOrder 方法来查询订单,然后返回检索到的订单实体的布尔字段。

到目前为止我的推理:

  1. 为什么我有一个端点来检索状态?
    • 我要求我的应用程序仅公开订单状态。我想,让端点返回一个“轻量级”对象-OrderStatusResponse,它本质上只包含一个布尔标志,这将是一个更简单的 API,更轻的网络负载,更容易让消费者理解和解析,等等。李>
  2. 一个单独的服务方法将我的端点与现有的getOrderInfo 服务方法和它的预期操作分离。如果有更多需求,专用服务方法将提供更大的灵活性
  3. 与上述观点相反,我的端点不能使用现有的getOrderInfo 服务方法,检索完整的订单 DTO 并提取必要的布尔字段并构建响应吗?在那种情况下,根本就没有新的服务方法。

问题:

  1. [MAIN Q] 是否可以在同一个服务方法中调用另一个服务方法 服务等级?
  2. 如果不是,那么正确的方法是什么?
  3. 我的推理有缺陷吗?

感谢您的阅读。

【问题讨论】:

    标签: java service soa


    【解决方案1】:

    从您的服务中调用您自己的 API 没有问题 - 如果它对“公众”开放,则它对您的内部使用开放。关键在于你的服务,了解内部服务结构,你可以走捷径。例如,在您的情况下,为什么只需要订单状态就检索完整订单

    【讨论】:

    • 谢谢!我开始思考同样的事情 - 为什么在我只需要状态时检索完整的订单。我最终只为订单状态定义了一个新的 repo 方法,而不是调用另一个服务方法。但是,感谢您对如何调用另一个服务方法也可行的见解。你认为这样做可能指向一个隐藏的问题吗?例如这里我应该只检索状态而不是 Order 对象。
    • 我认为这取决于太多的变量要说。我认为我可以在这里说的最好的指导方针是不要将其用作默认值——正如我在回复中所说,API 是为外部用户构建的并隐藏内部结构,这是你不需要为内部行为做的事情跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多