WCF单一操作与多操作?设计理念

时间:2010-10-12 20:26:33

标签: asp.net asp.net-mvc wcf architecture

我们正在开发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

如果服务需要调用大量方法,推荐的方法是什么?

感谢。

2 个答案:

答案 0 :(得分:2)

如果使用立面图案,则可以同时使用。

首先,使用第一个选项构建您的服务。这允许您拥有REST接口。如果需要,可以在外部使用。

然后,您可以创建一个使用Invoke消息样式的Facade,它会根据参数转换请求,并调用在第一步中创建的各个服务之一。

答案 1 :(得分:0)

关于多个特定操作与一个通用查询的问题 - 任何一种方法都可能有效;定义细粒度与粗粒度操作在某种程度上是一种品味问题。

当我们在RESTful服务中遇到类似的要求时,我选择创建一个从查询字符串读取参数的过滤器类,因此可用:

public NameValueCollection ReadQuerystring()
{
    return WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;
}

我在这里看到的一个更大的问题是你为你的操作参数继承了Message--你有没有理由这样做?最佳实践是为此目的创建数据契约(使用[DataContract]属性注释的对象)。