簡體   English   中英

用於檢索WCF服務公開的數據的模式?

[英]Pattern for retrieving data exposed by a WCF service?

是否有通過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}
}

您只有兩個選擇。

  1. 像您一樣創建唯一的名稱
  2. 傳遞“條件”對象,該對象包含具有各種條件可能性的數據成員。 這使您可以將單個Web服務與可擴展的條件輸入一起使用。 另一個好處是您可以添加新的標准變量,而無需更改服務的簽名。 這種方法的唯一缺點是,您必須做更多的工作來驗證輸入(例如,如果您期望一個條件,那么用戶是否指定了多個條件變量,等等)。

沒有正確的答案-這取決於您的喜好和api的外觀。

我不會選擇第一個。 WCF在消息方面起作用,因此強烈建議設計基於消息的合同。 從靈活性和可版本性角度來看,這更加方便。 幾個現實的例子:

  • 映射。 有很多不錯的映射工具。 我個人認為它們也很有幫助。 您可能想要創建一個Query對象,該對象將傳遞到存儲庫中以查詢數據。 配置從DTO到您的Query對象的映射比映射一堆方法參數要容易得多。

  • 編碼。 您可能想用驗證,日志記錄等屬性來修飾服務方法參數。 如果按照過程方式進行操作,則只需想象一下所有這些內容的方法定義將是什么樣子即可。

  • 除其他數據外,如果需要的話,通常還必須返回ErrorCode和ErrorMessage。 如果您有基類,這很容易做到。 包含那些屬性的ResponseBase和所有響應類都繼承了這一屬性。

  • 還有很多其他的

因此理想的合同定義應如下所示:

MethodResponse GetData(MethodRequest request);

在大多數情況下,還存在用於響應和請求對象的基類。 在處理WCF管道中的對象時,這可以簡化事情。

請注意,在WCF中,基本上有兩種方法兩個基於設計消息的合同。 DataContract和MessageContract 使用MessageContract,您可以進一步控制消息。

最后,如果您不信任我,請看看如何設計最廣泛的Web服務:Amazon,Facebook,Azure等。它們都是基於消息的!

很好的一篇文章,主題為“基於消息的Web服務的優點”,值得閱讀。

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM