2016-07-06 63 views
3

我已經看到類似的問題,對此回答是使用SQL Server和Nhibernate持久性。但Azure存儲有什麼意義?NServicebus 6,Azure存儲持久性,Sagas和複雜類型(集合)

我有一個擁有佐賀數據的類。這包含屬性是一個集合:

public class ResetPolicyData : ContainSagaData 
{ 
    public int NumberOfEmailsInGroup { get; set; } 
    public Guid EmailGroupId { get; set; } 

    public List<PasswordResetInformation> PasswordResetInformation { get; set; } 
} 

PasswordResetInformation包含幾個簡單的字符串屬性,就是這樣。

當傳奇試圖持久化數據到Azure存儲我得到以下錯誤:

The property type 'List 1' is not supported in windows azure table storage at NServiceBus.Persistence.AzureStorage.AzureSagaPersister.ToDictionaryTableEntity(Object entity, DictionaryTableEntity toPersist, IEnumerable`1 properties) in C:\Build\src\NServiceBus.Persistence.AzureStorage\SagaPersisters\AzureSagaPersister.cs:line

在我EndpointConfig我有以下的,所以我想我是有點期待NServiceBus奇蹟般地序列PasswordResetInformation成JSON並且只存儲它:

endpointConfiguration.UseSerialization<JsonSerializer>(); 

所以我的問題:有沒有辦法堅持佐賀數據到AzureStorage列表或其他集合?

回答

4

Azure存儲只有supports primitive types。因此,其他任何東西都應該被序列化(JSON,就像你所建議的那樣)並且以簡單類型存儲。這應該形成文件,這裏是一個link跟蹤文件的進展。

+1

似乎是其他數據類型的支持建成並得到了拉出。問題追蹤:https://github.com/Particular/NServiceBus.Persistence.AzureStorage/issues/7 –

0

這裏是我的解決辦法/破解,使這項工作:

public class ResetPolicyData : ContainSagaData 
{ 
    public int NumberOfEmailsInGroup { get; set; } 
    public string Email { get; set; } 

    /// <summary> 
    /// Dont reference directly. Only here for persisting data to Azurestorage. Use 
    /// AddPasswordResetInformation/GetPasswordResetInformation instead. 
    /// </summary> 
    public string PasswordResetInformationJson { get; set; } 

    #region Handle Searilize and Desearilize PasswordResetInformation 

    public void AddPasswordResetInformation(PasswordResetInformation value) 
    { 
     if (value == null) return; 

     //Hydrate collection 
     var collection = string.IsNullOrEmpty(PasswordResetInformationJson) ? 
      new List<PasswordResetInformation>() : JsonConvert.DeserializeObject<List<PasswordResetInformation>>(PasswordResetInformationJson); 

     //Check is unique before adding 
     if(!collection.Contains(value)) collection.Add(value); 

     PasswordResetInformationJson = JsonConvert.SerializeObject(collection); 
    } 

    public List<PasswordResetInformation> GetPasswordResetInformation() 
    { 
     return string.IsNullOrEmpty(PasswordResetInformationJson) ? 
      new List<PasswordResetInformation>() : JsonConvert.DeserializeObject<List<PasswordResetInformation>>(PasswordResetInformationJson); 
    } 

    #endregion 
}