2015-09-14 150 views
0

我正在研究一個相對較大的項目,我們試圖在可能的情況下暗示面向服務的體系結構,但由於今天的這一事實,我遇到了以下問題。 在我的表現層(ASP.NET Web Forms)我有一個User對象:將強類型對象轉換爲匿名類型

public class User 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public string Email {get; set;} 
    Public string State {get; set;} 
    public DateTime CreatedOn {get; set;} 
    public string CreatedBy {get; set;} 
} 

有在原來的項目多一些字段,但這種情況下,我認爲這並不重要。 所以在表示層我使用這個對象來顯示頁面上的用戶信息,並讓使用該應用程序的人員執行CRUD操作。 問題是我想創建一個新用戶。有獨立的Web Api 2服務項目爲 - 「UserService so all calls are made to the dedicated action from the UserService新創建的用戶的project and the response is the ID`,它是在他被創建初始狀態 所以要創建新的用戶我做這樣的事情:

public User InsertUser(string username, string email, string createdBy) 
    { 
     var user = new 
     { 
      Username = username, 
      Email = email, 
      CreatedBy = createdBy 
     } 

     var result = //make call to the user service passing the anonymous object 

     user newUser = new User 
     { 
      ID = result.ID, 
      Username = username, 
      Email = email, 
      CreatedBy = createdBy, 
      State = result.State 
     } 
     return newUser; 
    } 

由於某些原因,在不久的將來我不能解決,我不能引用一些DTO對象,並且該服務期望是來自同一類型的對象或匿名的對象,或者它不能反序列化數據。這裏有兩件事讓我感到困擾 - 第一件事是我創建了兩次實例,理想情況下它應該只是User類型的一個對象,在執行完s之後ervice我可以添加IDState像這樣:

newUser.Id = result.Id 
newUser.State = result.State 

相反,我創建了兩個obejcts這是遠遠理想。其次,我認爲可能的一件事是從表示層創建User的一個實例,但以某種方式轉換它,以便服務操作能夠對其進行反序列化。此外,這似乎是相當標準的情況,不包括我不能引用.dll或其他東西..但是,也許有另一種解決方案,我不知道這個問題?

編輯 在Web Api部分的方法是這樣的:

public HttpResponseMessage InsertUser([FromBody]UserDTO userToInsert) 
{ 
    var user = userToInsert; 
    //Call Stored Procedure to Insert the user 
    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, new {UserId = user.Id, State = user.State}); 
    return response; 
} 

,並在我的客戶,我把這種方法只是爲了讓起見,工作,我有一個嵌套類:

public class UserDetails 
{ 
    public int UserId {get; set;} 
    public string State {get; set;} 
} 
+0

什麼是服務方法的簽名?當你談論引用DLL時,我不確定我是否理解你。你的意思是你不能在你的項目中包含第三方庫嗎? –

+0

我有'ServiceContracts'項目通常用於解決這類問題。但是這種特殊情況是非常特殊的,我不能參考這個項目,所以我需要爲這個特定情況尋找解決方法。爲這種情況創建一個全新的項目是不值得的。最後我可以堅持我現在所擁有的,但我真的不想。 – Leron

+0

你真的沒有回答我的問題:)我問服務方法的簽名。例如'User CreateUser(object info)'。我的另一個問題是,你可以參考一些第三方庫,比如AutoMapper嗎? –

回答

1

你看過序列化成JSON,然後反序列化成一個匿名類型的對象?看看JSON.NET(http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm

+0

嗯我不完全得到它 - 我在最後調用服務的地方我需要返回具有正確類型的對象(請參閱方法簽名),並且如果您的意思是要在服務方面我不太明白,所以也許這會有助於提供示例。 – Leron

+0

用您的默認屬性選擇創建您的強類型用戶(新用戶())。將強類型對象序列化爲JSON(http://www.newtonsoft.com/json/help/html/SerializingJSON.htm),然後將該JSON反序列化爲匿名對象(http://www.newtonsoft.com/json/)幫助/ HTML/DeserializeAnonymousType.htm)。在服務中使用該匿名對象,並返回強類型對象。 –

+0

啊,我現在看到了。要明天試一試,如果有效的話會接受你的答案。謝謝。 – Leron

相關問題