多个结果的服务请求/响应合同指南

时间:2011-07-07 17:21:54

标签: c# web-services soap soa

我有一项客户服务,允许消费者通过以下标准检索客户:CustomerId,DriversLicense,EmailAddress,PhoneNumber。我的问题是如何构建针对此服务的请求/响应?我希望能够请求多个这些标准并返回正确的响应。请记住,对于未在指定条件下找到的客户,服务将返回null。

我想到了一些选择,但我正在试图找出设计耗材服务的正确方法:
1)为每个用例制定明确的合同:

// psuedo code for operations - proper request/response patterns apply normally
Customer  GetCustomerByCustomerId(string customerId);
Customer[] GetCustomersByCustomerIds(string[] customerId);
Customer GetCustomerByEmail(string emailAddress);
// .. etc. etc.

2)只有一个请求封装了所有内容;但是,电话号码不是唯一标识符。

// psuedo code for operations
Customer[] GetCustomers(string customerId, string email, string phone, string dl);

Customer[] GetCustomers(string[] customerIds, string[] emails, string[] phoneNumbers, string[] dls);

我认为显式是更具可读性的选项,但能够立即将所有信息提交给服务并且它决定如何处理它是很好的。 #1的问题在于它是多余的,但我认为它涵盖了每个用例。 #2的问题是客户可能会对哪个客户属于哪个请求感到困惑。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

一个快速的解决方案是使用转移对象本身作为搜索条件。这与query-by-example非常相似。

例如,将方法重写为

Customer[] getCustomers(Customer customerFilter) {
    Query q; // = new query on customer table
    if(customerFilter.isSetCustomerID()) {
        // add where clause to the query: 
        //     Customer.CUSTOMER_ID = customerFilter.getCustomerID()
    }
    // for each field
}

Customer[] getCustomers(Customer[] customerFilters) {
    Query q; // = new query on customer table
    // add where clause to the query for each field: 
        //    Customer.CUSTOMER_ID IN 
        //       [customerFilter : customerFilters].getCustomerID()

}