[英]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}
}
您只有兩個選擇。
沒有正確的答案-這取決於您的喜好和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.