NServicebus 6、Azure存储持久性、传奇和复杂类型(集合)

本文关键字:类型 复杂 集合 传奇 Azure 存储 持久性 NServicebus | 更新日期: 2023-09-27 17:55:02

我看到过类似的问题,回答是使用SQL Server和Nhibernate持久化。但是Azure存储呢?

我有一个保存Saga数据的类。它包含一个集合属性:

public class ResetPolicyData : ContainSagaData
{
    public int NumberOfEmailsInGroup { get; set; }
    public Guid EmailGroupId { get; set; }
    public List<PasswordResetInformation> PasswordResetInformation { get; set; }
}

PasswordResetInformation包含两个简单的字符串属性,这就是它。

当传奇尝试将数据持久化到Azure存储时,我得到以下错误:

属性类型'List 1'不支持在windows azure表存储NServiceBus.Persistence.AzureStorage.AzureSagaPersister。在C:'Build'src'NServiceBus.Persistence.AzureStorage'SagaPersisters'AzureSagaPersister.cs:line

在我的EndpointConfig中,我有以下内容,所以我想我有点期待NServiceBus将PasswordResetInformation神奇地序列化为JSON并存储它:

endpointConfiguration.UseSerialization<JsonSerializer>();

所以我的问题:是否有一种方法可以将Saga数据中的列表或其他集合持久化到AzureStorage?

NServicebus 6、Azure存储持久性、传奇和复杂类型(集合)

Azure存储只支持基本类型。因此,其他任何东西都应该被序列化(JSON,就像您建议的那样),并作为简单类型存储。这应该被记录下来,这里有一个链接可以跟踪记录进度。

这是我围绕/hack做的工作:

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
}