2013-10-23 53 views
5

我是ServiceStack新手。我有一個非常大的.NET C#解決方案,使用ORM的Cambium如何使用ServiceStack DTO TranslateTo和PopulateWith?

我將ServiceStack WebService項目添加到我的解決方案。我跟着the guide。正常工作。

現在我想添加UserService:Service使用TranslateToPopulateWith喜歡寫here返回User DTO。

[Route("/user")] 
[Route("/user/{Id}")] 
public class User 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
} 


public class UserService : Service 
{ 
    private Users users = new Users(); 

    public UserResponse Get(User request) 
    { 
     return new UserResponse { Result = users.Single(request.Id).TranslateTo<User>() }; 
    } 
} 

但是我無法找到這些方法。

我得到<my_object_returned_from_database> does not contain a definition for 'TranslateTo'

我確實克隆了ServiceStack存儲庫,我找不到任何擴展中的這些方法的任何實現。

我錯過了什麼?非常感謝你的幫助!

回答

4

對於ServiceStack v3,這是當前在NuGetTranslateTo和相關方法中可用的穩定版本,是ServiceStack.Common名稱空間中的擴展方法。請注意,如果您正在克隆GitHub倉庫,V3並不是master分支。因此,將一個using ServiceStack.Common添加到您的文件應該足以導入擴展方法。

ServiceStack v4,master GitHub中的分支是預覽版本。我認爲TranslateTo擴展方法被重命名爲ConvertTo

+0

謝謝@esker,沒有注意到另一個分支:-(但是我需要留在DynamicModel實現中,因爲從數據庫返回的對象是'dynamic',所以'TranslateTo'(可能遍歷屬性)沒有任何可複製的。 – davidpodhola

2

只爲未來我:雖然我能夠得到編譯的代碼,但它不會複製任何內容。這是因爲Cambium ORM返回DynamicModel:Gemini,它沒有定義(DTO相關的相關)屬性(參見下面的比較User類)。

比如我User類「數據訪問層」是這樣的:

public class User : DynamicModel, IUser 
{ 
    public User() : base() { } 

    public User(object dto) 
     : base(dto) 
    { 
    } 

    public Guid InternalId { get; set; } 
    public DateTime Created { get; set; } 
    public bool IsBlocked { get; set; } 

    public static implicit operator idata.User(User u) 
    { 
     idata.User result = new idata.User(); 
     u.CopyProperties(result); 
     return result; 
    } 
} 

所以在最後的DTO我再次使用DynamicModel和我的DTO User類:

[Route("/user")] 
[Route("/user/{Id}")] 
public class User : DynamicModel 
{ 
    public User(object dto) 
     : base(dto) 
    { 
    } 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
}