2016-07-06 21 views
3

Ich habe ähnliche Fragen zu diesem beantwortet, die SQL Server und Nhibernate Persistenz verwenden. Aber wie geht es mit Azure Storage?NServicebus 6, Azure Storage Persistence, Sagas und komplexe Typen (Sammlungen)

Ich habe eine Klasse, die Saga-Daten enthält. Das enthält eine Eigenschaft, die eine Sammlung ist:

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

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

PasswordResetInformation enthält ein paar einfache Zeichenfolgeneigenschaften und das ist es.

Wenn die Saga versucht, die Daten zu Azure Storage bestehen bleiben erhalte ich folgende Fehlermeldung:

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

In meinem EndpointConfig ich folgendes haben, damit ich glaube, ich Art NServiceBus von erwartet JSON auf magische Weise serialisiert PasswordResetInformation in und es nur speichern:

endpointConfiguration.UseSerialization<JsonSerializer>(); 

Also meine Frage: gibt es eine Möglichkeit, eine Liste oder eine andere Sammlung in Saga Daten zu AzureStorage bestehen bleiben?

Antwort

4

Nur Azure-Speicher supports primitive types. Daher sollte alles andere serialisiert werden (JSON, wie Sie vorgeschlagen haben, würde funktionieren) und als einfacher Typ gespeichert werden. Dies sollte dokumentiert werden und hier ist eine link, um den Fortschritt der Dokumentation zu verfolgen.

+1

Scheint, wie die Unterstützung für andere Datentypen gebaut wurde und wurde herausgezogen. Zu verfolgendes Problem: https://github.com/Particular/NServiceBus.Persistence.AzureStorage/issues/7 –

0

Hier ist meine Arbeit um/hacken diese Arbeit zu machen:

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 
}