2013-10-18 61 views
1

我已經創建了ServiceStack一個Web服務,它返回列表<SyncUserDTO>創建。 它有更多的屬性,但我將它簡化爲一個字段Timestamp。構造不代理類添加服務引用

[DataContract] 
public class SyncUserDTO 
{ 
    public SyncUserDTO() 
    { 
     Timestamp = new TimestampDTO(); 
    } 

    [DataMember(Order = 1)] 
    public TimestampDTO Timestamp { get; set; } 
} 

[DataContract] 
public class TimestampDTO 
{ 
    [DataMember] 
    public bool DataValid { get; set; } 
    [DataMember] 
    public DateTime? Value { get; set; } 
} 

服務似乎(與其他測試)完美地工作,但是當我創建一個客戶端控制檯應用程序,添加服務參考,SyncUserDTO不具備構造函數,這意味着這不起作用:

static void SendUsersServiceReference() 
{ 
    var users = new List<SyncUserDTO>(); 
    for (var i = 0; i < 5; i++) 
    { 
     var user = new SyncUserDTO(); 

     user.Timestamp.Value = DateTime.Now; // NullReferenceException, 
     user.Timestamp.DataValid = true;  // as Timestamp is null 
    } 
} 

當SyncUserDTO按下F12鍵,我似乎無法找到任何Reference.cs構造方法,解釋爲什麼上面不起作用。

偏偏是構造不是在客戶端應用程序在我的代理類產生的?

我需要做客戶端的「建設」自己,然後它的工作原理:

 var user = new SyncUserDTO() { Timestamp = new TimestampDTO() }; 

原因,我不希望誰消費我的服務有人們創造這個自己。他們應該真的注意底層的TimestampDTO。構造函數應該這樣做。

順便說一句,我搜索谷歌和SO之類的字詞「構造不代理類與創建添加服務引用」有和無「ServiceStack」,沒有結果,以幫助我在這個任務......

PS,裸露在我身邊,這是我的第一個問題:)請告訴我該改進什麼問題。

PPS。 Demis(ServiceStack),如果你正在閱讀這篇文章,是的SOAP正在出路,REST是新的黑人 - 但我想支持兩者,這看起來像ServiceStack,這真的很棒。我愛ServiceStack:d

+0

嗯,我嘗試了一個更多的搜索...找到這個... 是的,這是預期的行爲。 MVC網站實際上並未使用您的PageNavigation類。它是包含所有屬性的簡單副本(在添加Web服務引用時生成),但不包括構造函數在內的所有方法。 http://stackoverflow.com/questions/4750267/class-constructor-from-c-sharp-web-service-wont-auto-implement-properties-in 爲什麼不能複製方法也? – SvendK

回答

1

這是我的解決方案(現在):

我在服務,其中客戶端獲取一個新的UserDTO完成所有字段創建一個新的服務方法。這樣,構造函數就在服務器上運行。我敢打賭,我的表現非常出色,但這並不重要(現在......)。

服務DTO的:

[DataContract] 
public class ReturnNewEmptyUser : IReturn<ReturnNewEmptyUserResponse> {} 
[DataContract] 
public class ReturnNewEmptyUserResponse 
{ 
    [DataMember] 
    public SyncUserDTO User { get; set; } 
} 

的服務:

public class SyncService : Service 
{ 
    public ReturnNewEmptyUserResponse Any(ReturnNewEmptyUser request) 
    { 
     var user = new ReturnNewEmptyUserResponse { User = new SyncUserDTO() }; 
     return user; 
    } 
} 

在客戶端:

static void SendUsersServiceReference() 
    { 
     var webservice = new ServiceReference1.SyncReplyClient(); 

     var users = new List<User>(); 
     for (var i = 0; i < 5; i++) 
     { 
      var userResponse = webservice.ReturnNewEmptyUser(new ReturnNewEmptyUser()); 
      var user = userResponse.User; 

      user.Timestamp.Value = DateTime.Now; 
      user.Timestamp.DataValid = true; 
      // Continue with field population... 

      users.Add(user); 
     } 

     // Send users with webservice method 
     // ... 
    } 

我們想知道,如果它是揭露領域這是一個糟糕的方式辦法。這很好,因爲客戶端可以使用自動完成並精確知道所用的類型 - 但強制客戶端以特定格式創建XML/JSON會更好嗎?

這應該是在另一個問題 - 我想這個問題已經回答了:添加服務引用/代理類不包含方法(包括類型的構造函數),只有類型。如果你真的需要構造函數,讓它運行,然後暴露在服務器上,然後從客戶端使用它。就像亞當在這裏寫的一樣:Class constructor (from C# web service) won't auto-implement properties in C# MVC

btw - 這個設計是否存在任何安全問題?用戶通過url-credentials登錄(應該可能是頭認證),只有少數系統可以訪問它。

1

嘗試通過你要訪問它的時間來實例化你的財產,我知道that's的方法,但它可以在您的方案方便。

private TimestampDTO _timestamp; 
public TimestampDTO Timestamp 
{ 
    get 
    { 
     if(_timestamp==null) _timestamp=new TimestampDTO(); 
     return _timestamp; 
    } 
    set 
    { 
     _Timestamp=value; 
    } 
} 
+0

在服務器或客戶端上的Uhm? – SvendK

+0

在服務器端,如果在客戶端有人試圖從你的時間戳DTO得到它們的價值,他們永遠不會得到一個空引用 –

+0

呃,會試試:=)但是,這是正常的行爲,添加服務引用不是在客戶端的代理類中創建構造函數方法? – SvendK

0

代理類不保留實現細節,如構造函數。這只是一個DTO。這隻能通過共享項目共享課程來完成。

想想servicestack就是告訴它需要哪些屬性的客戶,他們的類型..實施達到客戶端。

+0

我明白了,就是我剛發現的內容(請參閱我對原始帖子的評論)。垃圾...我稍後發佈我的解決方法。 – SvendK

+0

我認爲你有問題的解決方案,你可以發佈答案,以便其他可以有所幫助。 –

+0

已接受我的解決方案。我敢打賭這不是推薦的方式。如果任何人都可以給我一個更好的方法,請這樣做:) – SvendK

相關問題