Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检索WCF服务公开的数据的模式?_Wcf_Design Patterns - Fatal编程技术网

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

检索WCF服务公开的数据的模式?,wcf,design-patterns,Wcf,Design Patterns,是否有任何通过WCF服务公开数据的建议模式?我使用的是netTCP,所以WCF数据服务已经推出。我有几个方法通常都是重载的,但由于WCF不支持重载,我不得不不断想出富有想象力的名称,或者在各种服务契约之间移动方法。比如说 [ServiceContract] public interface IFooService { [ServiceOperation] List<Foo> GetFoos (); [ServiceOperation] List&l

是否有任何通过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);
}
[服务合同]
公共接口iFoosService
{
[服务操作]
列出GetFoos();
[服务操作]
列出GetFoosByBar(int-barId);
[服务操作]
列出GetFoosByBaz(int barId、int baz);
[服务操作]
列出getfoosbybazbyqux(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}
}
[服务合同]
公共接口iFoosService
{
[服务操作]
列出GetFoos(FooRequest请求);
}
[数据合同]
公共食品请求
{
[数据成员]
公共int?BarId{get;set}
[DataMemeber]
公共int?BazId{get;set}
[数据成员]
公共字符串Qux{get;set}
}

您只有两个选项

  • 创建唯一的名称,就像您拥有的名称一样
  • 传入一个“criteria”对象,该对象包含具有各种条件可能性的数据成员。这允许您使用一个具有可扩展数量的条件输入的web服务。另外一个好处是,您可以添加新的标准变量,而无需更改服务的签名。这种方法的唯一缺点是,您必须做更多的工作来验证输入(例如,当您期望一个条件变量时,用户是否指定了多个条件变量,等等)

  • 没有正确的答案-这是主观的,取决于您喜欢什么以及您希望api的外观。

    我不同意第一个选项。WCF在消息方面工作,因此强烈建议设计基于消息的契约。从灵活性和可版本性的角度来看,这要方便得多。以下是几个现实生活中的例子:

    • 映射。有很多很好的映射工具。就我个人而言,我发现它们也非常有用。您可能希望创建一个查询对象,该对象被传递到存储库以查询数据。配置从DTO到查询对象的映射要比映射一组方法参数容易得多

    • 编码。您可能希望使用验证、日志等属性来修饰服务方法参数。只要想象一下,如果你按照过程的方式去做的话,你的方法定义会是什么样子

    • 通常,除了其他数据外,您还必须返回ErrorCode和ErrorMessage(如果适用)。如果你有一个基类,这是很容易做到的。包含这些属性和所有响应类的ResponseBase继承此属性

    • 还有很多其他的

    因此,理想的合同定义如下:

    MethodResponse GetData(MethodRequest request);
    
    在大多数情况下,响应和请求对象也有基类。在处理WCF管线中的对象时,这会简化工作

    请注意,在WCF中,基本上有两种方式两种基于设计消息的契约。数据合同和。使用MessageContract,您可以更好地控制您的消息

    最后,如果你不相信我,看看最广泛的网络服务是如何设计的:亚马逊、Facebook、Azure等等。它们都是基于消息的

    一篇关于这个主题的好文章-


    希望有帮助

    第二个选择是好的