Wcf SOA、请求/响应服务层、接受和返回请求/响应与阵列或请求/响应?

Wcf SOA、请求/响应服务层、接受和返回请求/响应与阵列或请求/响应?,wcf,web-services,architecture,soa,Wcf,Web Services,Architecture,Soa,我们正在使用WCF实现一个应用程序,其中每个请求都从一个基本请求类继承,每个响应都从基本响应类继承 该服务有一个单一的进程方法,它接受请求并返回响应 // Messages contract public abstract class Request {} public abstract class Response {} // Operation contract Response Process(Request request); 但是,我们团队的某些成员认为,与运营合同期望并返回单个请

我们正在使用WCF实现一个应用程序,其中每个请求都从一个基本请求类继承,每个响应都从基本响应类继承

该服务有一个单一的进程方法,它接受请求并返回响应

// Messages contract
public abstract class Request {}
public abstract class Response {}

// Operation contract
Response Process(Request request);
但是,我们团队的某些成员认为,与运营合同期望并返回单个请求/响应不同,它应该接受并返回一系列请求/响应

// Operation contract
Response[] Process(Request[] requests);
< P> >我个人认为它在语义上是不正确的,并且在需要立即处理相关请求集合的情况下(也许在一个批处理中),会考虑引入BatchRequest和批处理响应消息。

public class BatchRequest : Request
{
    public Request[] Requests {get;set;}
}
public class BatchResponses : Response
{
    public string BatchReference {get; set;} // for example
    public Response[] Responses {get;set;}
}
对我来说,接受和返回数组似乎是不正确的,这肯定是我在任何地方都没有见过的模式。这还有什么不对劲吗?如果是,是什么

有些人认为,接受/返回数组将使我们不需要引入批处理请求(如上图所示)的额外复杂性,并且您可以在数组中发送单个请求


谢谢

我更喜欢单个请求和响应,并使用命令模式成批完成多个操作


我发现SOA已经够复杂了,没有出现意外的模式。如果部分请求失败,会发生什么情况?是全部回滚,还是仅回滚失败的请求。啊,我的头开始痛了

首先,数组增加了不必要的复杂性。保持简单(和)愚蠢

比如说。错误应该如何处理?如果请求#1失败,是否仍应执行请求#2和#3?如何报告错误

您的同事希望通过发出所有请求来解决哪些问题?如果是性能问题,那就有点过早优化的味道。还有其他几种方法可以提高性能,但在真正需要之前不要做任何事情


如果要释放客户端而不是等待结果,请切换到异步客户端。

IMO,设计/建模这些服务的决策应完全基于其使用场景

在SOA建模过程中——目标应该是构建松散耦合的系统/服务——支持相关的业务领域(应用程序)

理想情况下,您的服务不应该太细粒度,也不应该太复杂。它的重用同样重要。因为这个原因,你需要考虑客户需要什么。 这里有几个场景,任何一个都可能有用

  • 信息即服务

    通过公共服务访问数据(主数据)。-在这种情况下,以批处理模式访问主数据是没有意义的

  • 更新组数据-将用户迁移到新销售计划的服务?(!)

  • 而且,我不认为用数组处理错误场景是一个问题——你真的不能概括这个问题——它是与上下文相关的。这是一个设计决定


    与上面的案例[2]一样,您可以处理所有内容并在响应[]内返回错误代码。

    根据我的经验,您的方法是从单个请求/响应模式开始,然后公开一个单独的BatchRequest/BatchResponse模式(具有请求/响应数组)无论从短期还是长期来看,都是API的最佳方法

    公开的初始API模式应该是单个请求和响应,只是为了有一个简单易懂的接口。简单的界面使API的模式(方法和对象)易于学习,这对于用户的采用非常重要。您的用户将欣赏这种简单性,因为他们第一次学习API并尝试启动并运行服务。强迫用户在初始API中构建请求数组是不可取的,这会使API过于复杂,而且对您的同事来说是过早的优化

    但是,您的同事是正确的,因为用户最终需要的是批处理请求和响应的选项,因为他们对API越来越熟悉。正如您所建议的,通过实现一个单独的BatchRequest/BatchResponse模式,您的同事真正关心的问题得到了最好的解决。实现一个单独的BatchRequest/BatchResponse模式是很常见的,它可以在singleton请求/响应模式的实现中构建并重用大部分代码。明确地说,我们的想法是从更早的版本批处理您的单例请求。根据我的经验,您的API必须启动并绑定到请求/响应数组模式的想法是不必要和毫无根据的

    现在,因为我不知道你同事的用例是什么,我想猜测一下他们为什么一开始就想要阵列。如果您的同事需要请求数组,因为他们关心在多个对象上执行多个CRUD操作,那么解决方案不是让请求数组,而是让单个请求绑定到单个CRUD操作类型,并让请求获取要批量执行操作的对象数组。您不希望强制用户对每个对象执行单独的请求,因为这肯定不会扩展。批处理最好被认为是一种高级API技术,仅在理解API的基本模式以及用户希望扩展其应用程序时使用


    也就是说,首先公开单个请求/响应模式,然后公开可选的batchrequest/batchresponse模式。构建单一请求/响应模式时要记住,这些请求最终将被批处理。

    作为一个概念,批处理请求似乎是有意义的——我过去为某些服务引入了此类模式,以减少“聊天次数”。那里