我有一项客户服务,允许消费者通过以下标准检索客户: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的问题是客户可能会对哪个客户属于哪个请求感到困惑。谢谢你的帮助!
答案 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()
}