2011-10-07 75 views
1

由于我问How has to be written the signature in facade pattern?问题,我想过如何为API创建一个签名,这个API必须既实用又高效(以及美观的解决方案!)。我看到在顶部的一些API及其边界接口公开签名的以下样式:返回一个通用对象与正面签名中的所有重要返回值是否合适?

public List<InterestingDTO> 
    ANecessaryMethodToCompleteABusinessProcess(int aParameter, 
    InterestingDTO aSecondParamenter) 

在这种风格,业务规则和侵犯其他正常/非正常业务情况必须使用特定的异常设计报告对于这个签名或者采用一些约定,例如在方法执行结束时返回空值来说明情况。

我认为使用异常来显示业务问题可能会导致可维护性问题,这肯定是一种不好的做法(有一大堆技术参考文献争论这个问题)。所以,应对这一问题,我建议使用这样的结构或类:

public class ReturnValue<T> 
{ 
    public T returnedValue; 
    public string message; 
    public Status status;  
} 

enum Status {SUCCESS, FAILURE, ANY_OTHER_STATUS}; 

前者签名然后可以这样写:

public ReturnValue<List<InterestingDTO>> 
     ANecessaryMethodToCompleteABusinessProcess(int aParameter, 
     InterestingDTO aSecondParamenter) 

凡任何消费层的所有有趣的事情可以至少有效地知道。请注意,控制流程没有例外情况(除了那些您希望外层知道的情况外),并且业务层可以拥有关于业务错误消息的完整控制权。你认为这种方法有什么缺陷吗?

请尽可能为您的答案添加一些参考书目。

回答

1

我们在整个企业应用程序中都使用相同的功能,并增加了两项功能,即1)针对交易服务,1项额外列表包含“验证结果”列表,每个属性模拟单个业务规则或验证规则违规,然后可以用尽可能多的上下文信息将其报告给客户端(用户或服务消费者),以及2)对于数据服务,我们添加寻呼信息,指示客户端有多少可用数据(给定我们只允许返回有限数量的行)。这可以让客户与分页策略联系起来。

到目前为止唯一的投诉是服务使用者 - 当我们公开服务方法在整个企业范围内返回类型化泛型时(ESB/SOA),泛型的WSDL /命名可能很麻烦(例如ReturnResultOfPOUpdateRequestJQ3KogUE)。如果我们在客户端和服务上共享实体,但是对于其他客户端(如Java,Mobile等)可能有问题,则这对于.NET客户端来说并不是很重要,有时我们需要为这些客户端提供替代外观,而不需要仿制药。

+0

对不起,我不会要求太具体的细节,但你的系统有多大?这是它的一些架构问题?知道它在生产吗?你有没有参考书目? – JPCF

+0

目前有2个系统正在使用该框架进行生产......一个是用户界面很重的用户,大约有500个用户。另一个主要是基于集成(EDI)的,报告的错误只是记录并通过电子邮件发送给相关用户(每天约100k条消息)。当前的担忧不在于错误处理 - FWIW主要关心的是如何以更通用的方式安全地跨越WCF对数据服务进行分类,而不会影响数据库安全性和/或缺少数据库索引。 RIA服务在这里似乎很适合。有关? – StuartLC

+0

是的......你的回答似乎很好,我想知道这个设计是否已经实施,因为它验证了我的想法。 – JPCF