我们正在开发CRM应用程序。所有业务逻辑和数据访问都通过WCF服务。我们有两个WCF和客户端之间的通信选项(目前:ASP.NET MVC 2)
一个选项是每个操作的create方法。实施例
GetCustomers()
GetCustomersWithPaging(int take, int skip)
GetCustomersWithFilter(string filter)
GetCustomersWithFilterPaging(string filter, int take, int skip)
or // new .net 4 feature
GetCustomers(string filter = null, int take = 0, int skip = 0)
... list goes..
另一个选择是创建名为
的通用单一服务操作响应InvokeMessage(Messege请求)。实施例
wcfservice.InvokeMessage(
new CustomerRequest {
Filter = "google",
Paging = new Page { take = 20, skip = 5}
});
// Service Implementation.
public Response InvokeMessage(Message request)
{
return request.InvokeMessage();
}
InvokeMessage =所有操作的通用单一服务调用。
CustomerRequest =来自消息抽象类的继承类,因此我可以根据输入要求从Message基类创建多个类。 这是CustomerRequest类。
public class CustomerRequest : Message
{
public string Filter {get;set;}
public Page Paging {get;set} // Paging class not shown here.
Public override Response InvokeMessage()
{
// business logic and data access
}
}
修改
public abstract class Message
{
public abstract Response InvokeMessage();
}
//所有服务调用仅通过InvokeMessage方法,但具有不同的消息请求。
基本上我可以避免每个服务电话和代理关闭等。 这种方法的一个直接暗示是我不能将此服务用作REST
如果服务需要调用大量方法,推荐的方法是什么?
感谢。
答案 0 :(得分:2)
如果使用立面图案,则可以同时使用。
首先,使用第一个选项构建您的服务。这允许您拥有REST接口。如果需要,可以在外部使用。
然后,您可以创建一个使用Invoke消息样式的Facade,它会根据参数转换请求,并调用在第一步中创建的各个服务之一。
答案 1 :(得分:0)
关于多个特定操作与一个通用查询的问题 - 任何一种方法都可能有效;定义细粒度与粗粒度操作在某种程度上是一种品味问题。
当我们在RESTful服务中遇到类似的要求时,我选择创建一个从查询字符串读取参数的过滤器类,因此可用:
public NameValueCollection ReadQuerystring()
{
return WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;
}
我在这里看到的一个更大的问题是你为你的操作参数继承了Message--你有没有理由这样做?最佳实践是为此目的创建数据契约(使用[DataContract]属性注释的对象)。