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?
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
}