用于检索WCF服务公开的数据的模式?

时间:2014-04-14 16:04:16

标签: wcf design-patterns

是否存在通过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}
}

2 个答案:

答案 0 :(得分:1)

您只有两个选择。

  1. 创建与您一样的唯一名称
  2. 通过&#39;标准&#39;包含具有各种标准可能性的数据成员的对象。这允许您使用具有可扩展数量的条件输入的单个Web服务。另一个好处是您可以添加新的条件变量而无需更改服务的签名。这种方法的唯一缺点是你必须做更多的工作来验证输入(例如,当你预期输入时,用户是否指定了多个标准变量等)。
  3. 没有正确的答案 - 根据您的喜好和您希望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

希望它有所帮助!

相关问题