我们正在使用WCF实现一个Request/Response Service Layer,其中每个请求都从一个基本请求类继承,每个响应都从基本响应类继承。
该服务有一个处理方法,它接受一个请求并返回一个响应。
// Messages contract
public abstract class Request {}
public abstract class Response {}
// Operation contract
Response Process(Request request);然而,我们团队的某些成员认为,操作契约应该接受并返回一组请求/响应,而不是期望和返回单个请求/响应。
// Operation contract
Response[] Process(Request[] requests);就我个人而言,我不认为它在语义上是正确的,如果需要立即处理相关请求的集合(可能是批处理的),我会考虑引入BatchRequest和BatchResponse消息。
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;}
}在我看来,接受和返回一个数组似乎并不正确,这肯定是我在任何地方都没有见过的模式。这是不是还有什么问题呢?如果是,是什么?
有些人认为,接受/返回数组可以让我们避免引入批处理请求的额外复杂性(如上图所示),而且无论如何都可以在数组中发送单个请求。
谢谢
发布于 2011-06-13 15:49:02
首先,数组增加了不必要的复杂性。保持简单(和)愚蠢。
例如。应该如何处理错误?如果请求#1失败,那么请求#2和#3是否应该被执行?应该如何报告错误?
您的同事希望通过创建所有请求数组来解决哪些问题?如果是性能方面的问题,那就像是过早的优化。还有其他几种方法可以提高性能,但在真正必要之前不要做任何事情。
如果要释放客户端而不是等待结果,请切换到异步客户端。
发布于 2011-06-04 18:23:46
我更喜欢单个请求和响应,并使用命令模式来批量处理要完成的多个操作。
我发现SOA已经足够复杂了,而且还没有看到意外的模式出现。如果部分请求失败,会发生什么情况?是全部回滚,还是只回滚失败的请求。啊哈,我的头开始疼了。
发布于 2011-06-13 21:55:32
国际海事组织,您设计/建模这些服务的决定应该完全基于其使用场景。
在SOA建模期间-目标应该是构建松散耦合的系统/服务-支持相关的业务域(应用程序)。
理想情况下--您的服务不应该太细粒度,也不应该太复合。它的重用也同样重要。正因为如此,你需要考虑客户的需求。
下面是一些场景,在这些场景中,任何一个都可能是有用的
通过公共服务访问数据(主数据)。-在这种情况下,以批处理模式访问主数据确实没有意义。
而且,我不认为用数组处理错误场景是一个问题-你真的不能概括这个问题-它是非常上下文的。这是一个设计决定。
就像上面的案例2一样--你可以在Response[]中处理所有的东西并返回错误代码。
https://stackoverflow.com/questions/6236136
复制相似问题