2013-03-20 63 views
2

我喜歡使用新的API我ServiceStack,並有一些遺留項目中的Pocos,我希望保持不變。然而,在我的ServiceStack項目中,將它們複製到Dto的感覺有點不明智。我是否可以懶惰,並以某種方式「傳遞」我的遺產pocos?使用現有的Poco作爲ServiceStack DTO

這一方法在JsonServiceClient不錯,但增加了一個額外水平的JSON,這是我不喜歡的:

[Route("/legacytype", "POST,OPTIONS")] 
public class RequestLegacyTypePost : IReturn<int> 
{ 
    public LegacyTypeLegacyType{ get; set; } 
} 

public class LegacyTypeService : Service 
{ 
    public object Post(RequestLegacyTypePost request) 
    { 
     return db.Insert(request.LegacyType); 
    } 
} 

複製正糊化特性的DTO的方式自然正常工作:

[Route("/legacytype", "POST,OPTIONS")] 
public class RequestLegacyTypePost : IReturn<int> 
{ 
    public int Id { get; set; } 
    public string SomeProp { get; set; } 
    public string OtherProp { get; set; } 
} 

也許那簡單是最佳實踐?

回答

2

ServiceStack允許您重新使用任何現有的Poco作爲請求DTO,如果您不想修改現有的舊版dll,那麼您可以在AppHost.Configure()中使用Fluent API非侵入式添加路由, :

Routes 
    .Add<LegacyTypeLegacyType>("/legacytype", "POST,OPTIONS"); 
+0

我測試了BiffBaffBoffs的建議,它似乎是拾取繼承模型的道具,它非常整潔,對於我目前看不到的方法有什麼缺點? – joeriks 2013-03-20 14:42:27

+1

不是真正的繼承在請求DTO上工作正常,我只是通常不喜歡[推薦DTO內的繼承](http://stackoverflow.com/a/10759250/85785)。 – mythz 2013-03-20 14:46:55

+0

好吧,明白了。當我使用Routes.Add時,甚至有可能讓新的api獲得LegacyType路由映射嗎?所以我可以使用JsonServiceClient,client.Post(legacyTypeObject) – joeriks 2013-03-20 15:07:56

1

你也可以繼承你的模型到自定義DTO,是這樣的:

[Route("/legacytype", "POST,OPTIONS")] 
RequestLegacyTypeDTO : LegacyType, IReturn<int> { } 

您訪問原始LegacyType模型的所有屬性這將使不改變它。

+0

很酷,這個工程!但對於乾淨的代碼,我明白我的錯誤首先在於我的DTO項目對我的遺留項目有依賴性。 – joeriks 2013-03-20 16:01:54