From addec01dc82437b4161710740947289d5594f770 Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Thu, 13 Mar 2025 11:55:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=81=E8=A3=85=E6=B0=B4=E7=94=B5=E8=A1=A8re?= =?UTF-8?q?dis=E7=BC=93=E5=AD=98=E6=89=B9=E9=87=8F=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasicScheduledMeterReadingService.cs | 212 ++++++++++++++---- ...nergySystemScheduledMeterReadingService.cs | 10 +- .../Helpers/JsonHelper.cs | 126 +++++++++++ .../FreeRedisProviderModule.cs | 21 +- .../FreeRedisProviderService.cs | 88 ++++---- .../IFreeRedisProviderService.cs | 39 ++-- .../Options/FreeRedisOptions.cs | 34 +-- 7 files changed, 389 insertions(+), 141 deletions(-) create mode 100644 src/JiShe.CollectBus.Common/Helpers/JsonHelper.cs diff --git a/src/JiShe.CollectBus.Application/Workers/BasicScheduledMeterReadingService.cs b/src/JiShe.CollectBus.Application/Workers/BasicScheduledMeterReadingService.cs index e5494a1..680354f 100644 --- a/src/JiShe.CollectBus.Application/Workers/BasicScheduledMeterReadingService.cs +++ b/src/JiShe.CollectBus.Application/Workers/BasicScheduledMeterReadingService.cs @@ -1,6 +1,8 @@ -using FreeRedis; +using DotNetCore.CAP; +using FreeRedis; using JiShe.CollectBus.Ammeters; using JiShe.CollectBus.Common.Consts; +using JiShe.CollectBus.Common.Helpers; using JiShe.CollectBus.Watermeter; using Microsoft.Extensions.Logging; using System; @@ -19,8 +21,10 @@ namespace JiShe.CollectBus.Workers public abstract class BasicScheduledMeterReadingService : CollectBusAppService, IScheduledMeterReadingService { private readonly ILogger _logger; - public BasicScheduledMeterReadingService(ILogger logger) + private readonly ICapPublisher _capBus; + public BasicScheduledMeterReadingService(ILogger logger, ICapPublisher capBus) { + _capBus = capBus; _logger = logger; } @@ -90,48 +94,21 @@ namespace JiShe.CollectBus.Workers //获取缓存中的电表信息 var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 1)}*"; var oneMinutekeyList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); - if (oneMinutekeyList == null || oneMinutekeyList.Length <=0) + if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0) { - _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-102"); + _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-101"); return; } - - //通过lua脚本一次性获取所有缓存内容 - var luaScript = @" - local results = {} - for i, key in ipairs(KEYS) do - local data = redis.call('HGETALL', key) - results[i] = {key, data} - end - return results"; - var oneMinuteAmmerterResult = FreeRedisProvider.FreeRedis.Eval(luaScript, oneMinutekeyList); // 传递 KEYS - if (oneMinuteAmmerterResult == null) - { - _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-102"); - return; - } - + // 解析结果(结果为嵌套数组) - var parsedResults = new Dictionary>(); - if (oneMinuteAmmerterResult is object[] arr) + List meterInfos = await GetMeterCacheData(oneMinutekeyList); + if (meterInfos == null || meterInfos.Count <= 0) { - foreach (object[] item in arr) - { - string key = (string)item[0]; - object[] fieldsAndValues = (object[])item[1]; - - var dict = new Dictionary(); - for (int i = 0; i < fieldsAndValues.Length; i += 2) - { - string field = (string)fieldsAndValues[i]; - string value = (string)fieldsAndValues[i + 1]; - dict[field] = value; - } - parsedResults[key] = dict; - } + _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-102"); + return; } - _logger.LogInformation($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理完成"); + _logger.LogInformation($"{nameof(AmmeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理完成"); } @@ -139,18 +116,52 @@ namespace JiShe.CollectBus.Workers /// 5分钟采集电表数据 /// /// - public virtual Task AmmeterScheduledMeterFiveMinuteReading() + public virtual async Task AmmeterScheduledMeterFiveMinuteReading() { - throw new NotImplementedException($"{nameof(AmmeterScheduledMeterFiveMinuteReading)}请根据不同系统类型进行实现"); + //获取缓存中的电表信息 + var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 5)}*"; + var oneMinutekeyList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); + if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0) + { + _logger.LogError($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} 5分钟采集电表数据处理时没有获取到缓存信息,-101"); + return; + } + + // 解析结果(结果为嵌套数组) + List meterInfos = await GetMeterCacheData(oneMinutekeyList); + if (meterInfos == null || meterInfos.Count <= 0) + { + _logger.LogError($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} 5分钟采集电表数据处理时没有获取到缓存信息,-102"); + return; + } + + _logger.LogInformation($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} 5分钟采集电表数据处理完成"); } /// /// 15分钟采集电表数据 /// /// - public virtual Task AmmeterScheduledMeterFifteenMinuteReading() + public virtual async Task AmmeterScheduledMeterFifteenMinuteReading() { - throw new NotImplementedException($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)}请根据不同系统类型进行实现"); + //获取缓存中的电表信息 + var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 15)}*"; + var oneMinutekeyList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); + if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0) + { + _logger.LogError($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} 15分钟采集电表数据处理时没有获取到缓存信息,-101"); + return; + } + + // 解析结果(结果为嵌套数组) + List meterInfos = await GetMeterCacheData(oneMinutekeyList); + if (meterInfos == null || meterInfos.Count <= 0) + { + _logger.LogError($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} 15分钟采集电表数据处理时没有获取到缓存信息,-102"); + return; + } + + _logger.LogInformation($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} 15分钟采集电表数据处理完成"); } #endregion @@ -211,9 +222,22 @@ namespace JiShe.CollectBus.Workers /// public virtual async Task WatermeterScheduledMeterOneMinuteReading() { - //获取缓存中的电表信息 - var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 1)}*"; - var oneMinuteList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); + //获取缓存中的水表信息 + var redisKeyList = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, 1)}*"; + var oneMinutekeyList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); + if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集水表据处理时没有获取到缓存信息,-101"); + return; + } + + // 解析结果(结果为嵌套数组) + List meterInfos = await GetMeterCacheData(oneMinutekeyList); + if (meterInfos == null || meterInfos.Count <= 0) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集水表数据处理时没有获取到缓存信息,-102"); + return; + } _logger.LogInformation($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集水表数据处理完成"); } @@ -222,21 +246,113 @@ namespace JiShe.CollectBus.Workers /// 5分钟采集电表数据 /// /// - public virtual Task WatermeterScheduledMeterFiveMinuteReading() + public virtual async Task WatermeterScheduledMeterFiveMinuteReading() { - throw new NotImplementedException($"{nameof(WatermeterScheduledMeterFiveMinuteReading)}请根据不同系统类型进行实现"); + //获取缓存中的水表信息 + var redisKeyList = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, 5)}*"; + var oneMinutekeyList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); + if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} 5分钟采集水表据处理时没有获取到缓存信息,-101"); + return; + } + + // 解析结果(结果为嵌套数组) + List meterInfos = await GetMeterCacheData(oneMinutekeyList); + if (meterInfos == null || meterInfos.Count <= 0) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} 5分钟采集水表数据处理时没有获取到缓存信息,-102"); + return; + } + + _logger.LogInformation($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} 5分钟采集水表数据处理完成"); } /// /// 15分钟采集电表数据 /// /// - public virtual Task WatermeterScheduledMeterFifteenMinuteReading() + public virtual async Task WatermeterScheduledMeterFifteenMinuteReading() { - throw new NotImplementedException($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)}请根据不同系统类型进行实现"); + //获取缓存中的水表信息 + var redisKeyList = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, 15)}*"; + var oneMinutekeyList = await FreeRedisProvider.FreeRedis.KeysAsync(redisKeyList); + if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)} 15分钟采集水表据处理时没有获取到缓存信息,-101"); + return; + } + + // 解析结果(结果为嵌套数组) + List meterInfos = await GetMeterCacheData(oneMinutekeyList); + if (meterInfos == null || meterInfos.Count <= 0) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)} 15分钟采集水表数据处理时没有获取到缓存信息,-102"); + return; + } + + _logger.LogInformation($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)} 15分钟采集水表数据处理完成"); } #endregion + + #region 公共处理方法 + /// + /// 批量获取缓存的表计信息 + /// + /// + /// + /// + private async Task> GetMeterCacheData(string[] redisKeys) + { + //通过lua脚本一次性获取所有缓存内容 + var luaScript = @" + local results = {} + for i, key in ipairs(KEYS) do + local data = redis.call('HGETALL', key) + results[i] = {key, data} + end + return results"; + var oneMinuteAmmerterResult = await FreeRedisProvider.FreeRedis.EvalAsync(luaScript, redisKeys); //传递 KEYS + if (oneMinuteAmmerterResult == null) + { + _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-102"); + return null; + } + + // 解析结果(结果为嵌套数组) + List meterInfos = new List(); + if (oneMinuteAmmerterResult is object[] arr) + { + foreach (object[] item in arr) + { + string key = (string)item[0]; + object[] fieldsAndValues = (object[])item[1]; + + for (int i = 0; i < fieldsAndValues.Length; i += 2) + { + string field = (string)fieldsAndValues[i]; + string valueStr = (string)fieldsAndValues[i + 1]; + T value = default; + if (!string.IsNullOrWhiteSpace(valueStr)) + { + value = valueStr.Deserialize()!; + } + if (value != null) + { + meterInfos.Add(value); + } + else + { + _logger.LogInformation($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集电表{key}数据{field}处理异常"); + } + } + } + } + + return meterInfos; + } + #endregion } } diff --git a/src/JiShe.CollectBus.Application/Workers/EnergySystemScheduledMeterReadingService.cs b/src/JiShe.CollectBus.Application/Workers/EnergySystemScheduledMeterReadingService.cs index a5d5940..07e0264 100644 --- a/src/JiShe.CollectBus.Application/Workers/EnergySystemScheduledMeterReadingService.cs +++ b/src/JiShe.CollectBus.Application/Workers/EnergySystemScheduledMeterReadingService.cs @@ -1,4 +1,5 @@ -using FreeRedis; +using DotNetCore.CAP; +using FreeRedis; using JiShe.CollectBus.Ammeters; using JiShe.CollectBus.Common.Consts; using JiShe.CollectBus.Devices; @@ -25,13 +26,10 @@ namespace JiShe.CollectBus.Workers //[Route($"/energy/app/scheduled")] public class EnergySystemScheduledMeterReadingService : BasicScheduledMeterReadingService { - private readonly IRepository _deviceRepository; - private readonly ILogger _logger; - public EnergySystemScheduledMeterReadingService(IRepository deviceRepository, ILogger logger):base(logger) + public EnergySystemScheduledMeterReadingService(ILogger logger, ICapPublisher capBus) :base(logger, capBus) { - this._deviceRepository = deviceRepository; - this._logger = logger; + } public sealed override string SystemType => SystemTypeConst.Energy; diff --git a/src/JiShe.CollectBus.Common/Helpers/JsonHelper.cs b/src/JiShe.CollectBus.Common/Helpers/JsonHelper.cs new file mode 100644 index 0000000..029ae1f --- /dev/null +++ b/src/JiShe.CollectBus.Common/Helpers/JsonHelper.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Threading.Tasks; + +namespace JiShe.CollectBus.Common.Helpers +{ + /// + /// json帮助类 + /// + public static class JsonHelper + { + /// + /// json对象转换成字符串 + /// + /// 需要序列化的对象 + /// 是否忽略实体中实体,不再序列化里面包含的实体 + /// 配置 + /// + public static string Serialize(this object obj, bool IsIgnore = false, JsonSerializerOptions jsonSerializerOptions = null) + { + if (jsonSerializerOptions == null) + { + jsonSerializerOptions = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + WriteIndented = false, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + } + + if (jsonSerializerOptions.Converters != null) + { + jsonSerializerOptions.Converters.Add(new DateTimeJsonConverter()); + } + + if (IsIgnore == true) + { + jsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; // 忽略循环引用 + + return JsonSerializer.Serialize(obj, jsonSerializerOptions); + } + else + { + return JsonSerializer.Serialize(obj, jsonSerializerOptions); + } + } + + /// + /// json字符串转换成json对象 + /// + /// + /// + /// 是否忽略实体中实体,不再序列化里面包含的实体 + /// 配置 + /// + public static T? Deserialize(this string json, bool IsIgnore = false, JsonSerializerOptions jsonSerializerOptions = null) + { + if (jsonSerializerOptions == null) + { + jsonSerializerOptions = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + WriteIndented = false, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + } + + if (jsonSerializerOptions.Converters != null) + { + jsonSerializerOptions.Converters.Add(new DateTimeJsonConverter()); + } + + if (IsIgnore == true) + { + jsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; // 忽略循环引用 + + return json == null ? default(T) : JsonSerializer.Deserialize(json, jsonSerializerOptions); + } + else + { + return json == null ? default(T) : JsonSerializer.Deserialize(json, jsonSerializerOptions); + } + } + + /// + /// list json字符串转换成list + /// + /// + /// + /// + public static List? DeserializeToList(this string json) + { + return json == null ? default(List) : Deserialize>(json); + } + } + + + public class DateTimeJsonConverter : JsonConverter + { + private readonly string _dateFormatString; + public DateTimeJsonConverter() + { + _dateFormatString = "yyyy-MM-dd HH:mm:ss"; + } + + public DateTimeJsonConverter(string dateFormatString) + { + _dateFormatString = dateFormatString; + } + + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return DateTime.Parse(reader.GetString()); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(_dateFormatString)); + } + } +} diff --git a/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderModule.cs b/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderModule.cs index 881cab9..768332f 100644 --- a/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderModule.cs +++ b/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderModule.cs @@ -8,20 +8,23 @@ using System.Text; using System.Threading.Tasks; using Volo.Abp.Modularity; -namespace JiShe.CollectBus.FreeRedisProvider; - -public class FreeRedisProviderModule : AbpModule +namespace JiShe.CollectBus.FreeRedisProvider { - public override void ConfigureServices(ServiceConfigurationContext context) + public class FreeRedisProviderModule : AbpModule { - var configuration = context.Services.GetConfiguration(); - - Configure(options => + public override void ConfigureServices(ServiceConfigurationContext context) { - configuration.GetSection("Redis").Bind(options); - }); + var configuration = context.Services.GetConfiguration(); + + Configure(options => + { + configuration.GetSection("Redis").Bind(options); + }); + } } } + + diff --git a/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderService.cs b/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderService.cs index c4bf3ff..b36001d 100644 --- a/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderService.cs +++ b/src/JiShe.CollectBus.FreeRedisProvider/FreeRedisProviderService.cs @@ -11,53 +11,55 @@ using System.Text.Json; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; -namespace JiShe.CollectBus.FreeRedisProvider; - -public class FreeRedisProviderService : IFreeRedisProviderService, ISingletonDependency +namespace JiShe.CollectBus.FreeRedisProvider { - private FreeRedisOptions _freeRedisOptions; - /// - /// FreeRedis - /// - public FreeRedisProviderService(IOptions options) + public class FreeRedisProviderService : IFreeRedisProviderService, ISingletonDependency { - _freeRedisOptions = options.Value; - } + private FreeRedisOptions _freeRedisOptions; - [NotNull] - public IRedisClient FreeRedis - { - get + /// + /// FreeRedis + /// + public FreeRedisProviderService(IOptions options) { - return GetClient(); + _freeRedisOptions = options.Value; + } + + [NotNull] + public IRedisClient FreeRedis + { + get + { + return GetClient(); + } + } + + /// + /// 获取 FreeRedis 客户端 + /// + /// + public IRedisClient GetClient() + { + string connectionString = $"{_freeRedisOptions.Configuration},defaultdatabase={_freeRedisOptions.DefaultDB}"; + var redisClient = new RedisClient(connectionString); + redisClient.Serialize = obj => JsonSerializer.Serialize(obj); + redisClient.Deserialize = (json, type) => JsonSerializer.Deserialize(json, type); + redisClient.Notice += (s, e) => Trace.WriteLine(e.Log); + + return redisClient; + } + + /// + /// 切换Redis数据库 + /// + /// + /// + public IRedisClient GetDatabase(int index = 0) + { + var redisClient = GetClient(); + redisClient.GetDatabase(index); + return redisClient; } } - - /// - /// 获取 FreeRedis 客户端 - /// - /// - public IRedisClient GetClient() - { - string connectionString = $"{_freeRedisOptions.Configuration},defaultdatabase={_freeRedisOptions.DefaultDB}"; - var redisClinet = new RedisClient(connectionString); - redisClinet.Serialize = obj => JsonSerializer.Serialize(obj); - redisClinet.Deserialize = (json, type) => JsonSerializer.Deserialize(json, type); - redisClinet.Notice += (s, e) => Trace.WriteLine(e.Log); - - return redisClinet; - } - - /// - /// 切换Redis数据库 - /// - /// - /// - public IRedisClient GetDatabase(int index = 0) - { - var redisClinet = GetClient(); - redisClinet.GetDatabase(index); - return redisClinet; - } -} +} \ No newline at end of file diff --git a/src/JiShe.CollectBus.FreeRedisProvider/IFreeRedisProviderService.cs b/src/JiShe.CollectBus.FreeRedisProvider/IFreeRedisProviderService.cs index 6f0ff63..2e244dc 100644 --- a/src/JiShe.CollectBus.FreeRedisProvider/IFreeRedisProviderService.cs +++ b/src/JiShe.CollectBus.FreeRedisProvider/IFreeRedisProviderService.cs @@ -5,25 +5,26 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace JiShe.CollectBus.FreeRedisProvider; - -public interface IFreeRedisProviderService +namespace JiShe.CollectBus.FreeRedisProvider { - /// - /// 默认客户端 - /// - IRedisClient FreeRedis { get; } + public interface IFreeRedisProviderService + { + /// + /// 默认客户端 + /// + IRedisClient FreeRedis { get; } - /// - /// 获取客户端 - /// - /// - IRedisClient GetClient(); + /// + /// 获取客户端 + /// + /// + IRedisClient GetClient(); - /// - /// 切换Redis数据库 - /// - /// - /// - IRedisClient GetDatabase(int index = 0); -} + /// + /// 切换Redis数据库 + /// + /// + /// + IRedisClient GetDatabase(int index = 0); + } +} diff --git a/src/JiShe.CollectBus.FreeRedisProvider/Options/FreeRedisOptions.cs b/src/JiShe.CollectBus.FreeRedisProvider/Options/FreeRedisOptions.cs index bddfa28..75d92a2 100644 --- a/src/JiShe.CollectBus.FreeRedisProvider/Options/FreeRedisOptions.cs +++ b/src/JiShe.CollectBus.FreeRedisProvider/Options/FreeRedisOptions.cs @@ -4,22 +4,24 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace JiShe.CollectBus.FreeRedisProvider.Options; - -public class FreeRedisOptions +namespace JiShe.CollectBus.FreeRedisProvider.Options { - /// - /// 连接字符串 - /// - public string? Configuration { get; set; } + public class FreeRedisOptions + { + /// + /// 连接字符串 + /// + public string? Configuration { get; set; } - /// - /// 默认数据库 - /// - public string? DefaultDB { get; set; } + /// + /// 默认数据库 + /// + public string? DefaultDB { get; set; } + + /// + /// HangfireDB + /// + public string? HangfireDB { get; set; } + } +} - /// - /// HangfireDB - /// - public string? HangfireDB { get; set; } -} \ No newline at end of file