是否存在通过WCF服务公开数据的建议模式?我正在使用netTCP,因此WCF数据服务已经完成。我有几种方法通常只是重载,但由于WCF不支持它,我必须不断提出富有想象力的名称或在各种服务合同之间移动方法。例如
[ServiceContract]
public interface IFooService
{
[ServiceOperation]
List<Foo> GetFoos ();
[ServiceOperation]
List<Foo> GetFoosByBar (int barId);
[ServiceOperation]
List<Foo> GetFoosByBarByBaz (int barId, int baz);
[ServiceOperation]
List<Foo> GetFoosByBarByBazByQux (int bardId, int baz, string qux);
}
我更愿意使用一个GetFoos方法。这种做法是否会创造这样的东西
[ServiceContract]
public interface IFooService
{
[ServiceOperation]
List<Foo> GetFoos(FooRequest request);
}
[DataContract]
public FooRequest
{
[DataMember]
public int? BarId {get;set}
[DataMemeber]
public int? BazId {get;set}
[DataMember]
public string Qux {get;set}
}
答案 0 :(得分:1)
您只有两个选择。
没有正确的答案 - 根据您的喜好和您希望api的外观,它是主观的。
答案 1 :(得分:0)
我不会选择第一个选项。 WCF在消息方面起作用,因此强烈建议设计基于消息的合同。从灵活性和可版本性角度来看,这更方便。几个现实生活中的例子:
映射。有很多很好的映射工具。就个人而言,我发现它们也非常有用。您可能希望创建一个Query对象,该对象将传递到您的存储库以查询数据。配置从DTO到Query对象的映射比映射一堆方法参数要容易得多。
编码。您可能希望使用验证,日志记录等属性来装饰服务方法参数。如果你采用程序化的方式,只需用你所有的东西对你的方法定义进行成像。
除了其他数据之外,您还必须返回ErrorCode和ErrorMessage(如果适用)。如果你有一个基类,这很容易做到。 ResponseBase包含这些属性,所有响应类都继承此属性。
还有很多其他人。
理想的合约定义如下:
MethodResponse GetData(MethodRequest request);
在大多数情况下,还有响应和请求对象的基类。这样可以在处理WCF管道中的对象时简化操作。
请注意,在WCF中基本上有两种基于设计消息的合同。 DataContract和MessageContract。使用MessageContract,您可以更好地控制您的消息。
最后,如果你不相信我,只需看看大多数广泛传播的网络服务是如何设计的:亚马逊,Facebook,Azure等。它们都是基于消息的!
阅读有关该主题的好文章 - Advantages of message based web services。
希望它有所帮助!