2012-11-02 21 views
3

我讀過這篇文章的@mythz https://stackoverflow.com/a/12413091/1095655,但我的聲望不夠高置評版本在ServiceStack - 再次

我有一個問題是決策工作。如果使用版本1 DTO獲取請求,則版本不存在於傳輸的數據中,因爲版本1 DTO沒有版本屬性。當ServiceStack對請求進行反序列化時,它會創建一個DTO對象(版本3),並將版本設置爲2,並且由於未從傳輸的數據收到版本,所以版本未按預期覆蓋爲0。 正如我所看到的,您需要從DTO開始實施版本,否則它將無法正常工作。

希望我錯了,有人可以澄清我失蹤了什麼?這可以解決,因爲我有一個DTO在生產沒有版本實現?

回答

3

是啊,這可能會非常棘手,因爲你想在構造函數中的版本號,以便每個呼叫在同一構造函數將使用相同的時間分配了含蓄的版本時,你反序列化到新的當你第一次添加Version信息DTO。

不幸的是,原始DTO中沒有版本,因此它不會被序列化到網絡上,因此它不會覆蓋隱式分配的版本字段。

要解決此問題(並在構造函數中保留隱式賦值的版本號),您需要有效地重置在反序列化中使用的版本。

您可以通過覆蓋在App_Start的JsConfig.ModelFactory用JSON/JSV串行做到這一點(即在你的AppConfig),它允許您控制在反序列化使用的每種類型POCO創建的實例。

在這種情況下,我們要重置,有一個版本回到0這樣的DTO沒有版本號的任何DTO分配0 DTO的同時,用版本號將覆蓋它:

JsConfig.ModelFactory = type => { 
    if (typeof(IHasVersion).IsAssignableFrom(type)) 
    { 
     return() => { 
      var obj = (IHasVersion)type.CreateInstance(); 
      obj.Version = 0; 
      return obj; 
     }; 
    } 
    return() => type.CreateInstance(); 
}; 

我使用明確的IHasVersion界面爲簡單起見,但您也可以輕鬆地使用反射來檢測和重新分配包含版本號的類型。

下面是一個原始的DTO的例子沒有版本屬性反序列化到一個DTO與隱含分配版本號:

public class Dto 
{ 
    public string Name { get; set; } 
} 

public interface IHasVersion 
{ 
    int Version { get; set; } 
} 

public class DtoV1 : IHasVersion 
{ 
    public int Version { get; set; } 
    public string Name { get; set; } 

    public DtoV1() 
    { 
     Version = 1; 
    } 
} 

現在,當你反序列化原DTO轉化成其保留爲0的新DtoV1

var dto = new Dto { Name = "Foo" }; 
var fromDto = dto.ToJson().FromJson<DtoV1>(); 
fromDto.Version // 0 
fromDto.Name // Foo 

如果你使用新的DTO它填充的版本號:

var dto1 = new DtoV1 { Name = "Foo 1" }; 
var fromDto1 = dto1.ToJson().FromJson<DtoV1>(); 
fromDto.Version // 1 
fromDto.Name // Foo 1 
wsrl
+0

令人難以置信的解決方案。感謝mythz – BoKDamgaard

相關問題