public static IServiceCollection AddCaching(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <CachingConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { services.AddSingleton(typeof(ICacheManager), sp => CreateManager(sp)); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } services.AddSingleton(typeof(ICacheManager), sp => CreateManager(sp, ((CachingConfigurationSetting)setting).Name)); } services.AddSingleton <IMemoryCacheManager>(sp => new MemoryCacheManager(sp)) .AddSingleton(sp => sp.GetService(typeof(ICacheManager)) as IDistributedCacheManager); return(services); }
/// <summary> /// 根据应用程序配置,创建订阅管理器。 /// </summary> /// <param name="configName">应用程序配置项的名称。</param> /// <returns><paramref name="configName"/>缺省时,如果应用程序未配置,则为 <see cref="DefaultSubscribeManager"/>,否则为配置项对应的 <see cref="ISubscribeManager"/> 实例。</returns> public static ISubscribeManager CreateManager(string configName = null) { ISubscribeManager manager; IConfigurationSettingItem setting = null; var section = ConfigurationUnity.GetSection <SubscribeConfigurationSection>(); if (section != null && section.Factory != null) { manager = ConfigurationUnity.Cached <ISubscribeManager>($"Subscribe_{configName}", () => section.Factory.CreateInstance(configName) as ISubscribeManager); if (manager != null) { return(manager); } } if (string.IsNullOrEmpty(configName)) { if (section == null || (setting = section.GetDefault()) == null) { return(DefaultSubscribeManager.Instance); } } else if (section != null) { setting = section.GetSetting(configName); } if (setting == null) { return(null); } return(ConfigurationUnity.Cached <ISubscribeManager>($"Subscribe_{configName}", () => ConfigurationUnity.CreateInstance <SubscribeConfigurationSetting, ISubscribeManager>(setting, s => s.SubscriberType))); }
/// <summary> /// 根据应用程序配置,创建日志管理器。 /// </summary> /// <param name="configName">应用程序配置项的名称。</param> /// <returns><paramref name="configName"/>缺省时,如果应用程序未配置,则为 <see cref="DefaultLogger"/>,否则为配置项对应的 <see cref="ILogger"/> 实例。</returns> public static ILogger CreateLogger(string configName = null) { ILogger logger; IConfigurationSettingItem setting = null; var section = ConfigurationUnity.GetSection <LoggingConfigurationSection>(); if (section != null && section.Factory != null) { logger = section.Factory.CreateInstance(configName) as ILogger; if (logger != null) { return(logger); } } if (string.IsNullOrEmpty(configName)) { if (section == null || (setting = section.GetDefault()) == null) { return(DefaultLogger.Instance); } } else if (section != null) { setting = section.GetSetting(configName); } if (setting == null) { return(null); } return(ConfigurationUnity.CreateInstance <LoggingConfigurationSetting, ILogger>(setting, s => s.LogType)); }
/// <summary> /// 根据应用程序配置,创建缓存管理器。 /// </summary> /// <param name="configName">应用程序配置项的名称。</param> /// <returns><paramref name="configName"/>缺省时,如果应用程序未配置,则为 <see cref="MemoryCacheManager"/>,否则为配置项对应的 <see cref="ICacheManager"/> 实例。</returns> public static ICacheManager CreateManager(string configName = null) { ICacheManager manager; IConfigurationSettingItem setting = null; var section = ConfigurationUnity.GetSection <CachingConfigurationSection>(); if (section != null && section.Factory != null) { manager = section.Factory.CreateInstance(configName) as ICacheManager; if (manager != null) { return(manager); } } if (string.IsNullOrEmpty(configName)) { if (section == null || (setting = section.GetDefault()) == null) { return(MemoryCacheManager.Instance); } } else if (section != null) { setting = section.GetSetting(configName); } if (setting == null) { return(null); } return(ConfigurationUnity.CreateInstance <CachingConfigurationSetting, ICacheManager>(setting, s => s.CacheType)); }
/// <summary> /// 初始化提供者。 /// </summary> private static void InitializeProviders() { lock (providerWappers) { //内置的提供者 #if !NETSTANDARD AddProvider("OleDb", OleDbProvider.Instance); AddProvider("Odbc", OdbcProvider.Instance); #endif AddProvider("SqlServer", MsSqlProvider.Instance); AddProvider("MsSql", MsSqlProvider.Instance); AddProvider("Oracle", OracleProvider.Instance); AddProvider("SQLite", SQLiteProvider.Instance); AddProvider("MySql", MySqlProvider.Instance); AddProvider("PostgreSql", PostgreSqlProvider.Instance); AddProvider("Firebird", FirebirdProvider.Instance); AddProvider("DB2", DB2Provider.Instance); //取配置,注册自定义提供者 var section = ConfigurationUnity.GetSection <ProviderConfigurationSection>(); if (section != null) { RegisterCustomProviders(section); } } }
/// <summary> /// 尝试通过表达式获取执行后的结果缓存。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expression"></param> /// <param name="func"></param> /// <returns></returns> internal static T TryGet <T>(Expression expression, Func <T> func) { var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var option = section == null ? TranslateOptions.Default : section.Options; var result = CacheableChecker.Check(expression); //没有开启数据缓存 if ((result.Enabled == null && !option.CacheExecution) || result.Enabled == false) { return(func()); } var cacheMgr = CacheManagerFactory.CreateManager(); if (cacheMgr == null) { return(func()); } var cacheKey = ExpressionKeyGenerator.GetKey(expression, "Exec"); cacheKey = NativeCacheKeyContext.GetKey(cacheKey); Reference(cacheKey, expression); var segment = SegmentFinder.Find(expression); var pager = segment as DataPager; var cacheFunc = new Func <CacheItem <T> >(() => { var data = EnumerateData(func()); var isEnumerable = typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(IEnumerable <>); if (isEnumerable) { var elementType = typeof(T).GetEnumerableElementType(); var method = typeof(Enumerable).GetMethod(nameof(Enumerable.ToList)).MakeGenericMethod(elementType); data = (T)method.Invoke(null, new object[] { data }); } var total = 0; if (pager != null) { total = pager.RecordCount; } return(new CacheItem <T> { Data = data, Total = total }); }); var cacheItem = cacheMgr.TryGet(cacheKey, cacheFunc, () => new RelativeTime(result.Expired ?? TimeSpan.FromSeconds(option.CacheExecutionTimes))); if (pager != null) { pager.RecordCount = cacheItem.Total; } return(cacheItem.Data); }
/// <summary> /// 重新加载配置节 fireasy/dataProviders。 /// </summary> public static void Reload() { lock (m_locker) { _configuration = ConfigurationUnity.Load <ProviderSetting>("fireasy/dataProviders") as ProviderConfiguration; } }
internal static IServiceCollection AddSubscriber(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <SubscribeConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { services.AddSingleton(typeof(ISubscribeManager), DefaultSubscribeManager.Instance); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } services.AddSingleton(typeof(ISubscribeManager), ((SubscribeConfigurationSetting)setting).SubscriberType); } return(services); }
public Expression GetExecutionPlan(Expression expression, TranslateOptions option = null) { try { LambdaExpression lambda = expression as LambdaExpression; if (lambda != null) { expression = lambda.Body; } var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var package = GetTranslateProvider(); var options = option ?? (section == null ? package.CreateOptions() : section.Options); using (var scope = new TranslateScope(context, package)) { var translation = package.Translate(expression, options); var parameters = lambda != null ? lambda.Parameters : null; var provider = Find(expression, parameters, typeof(QueryProvider)); if (provider == null) { var rootQueryable = Find(expression, parameters, typeof(IQueryable)); provider = Expression.Property(rootQueryable, typeof(IQueryable).GetProperty("Provider")); } return(package.BuildExecutionPlan(translation, provider, options)); } } catch (Exception ex) { throw new TranslateException(expression, ex); } }
internal static IServiceCollection AddLogger(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <LoggingConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { services.AddTransient(typeof(ILogger), sp => CreateLogger(sp)); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } services.AddTransient(typeof(ILogger), sp => CreateLogger(sp, ((LoggingConfigurationSetting)setting).Name)); } return(services); }
internal static void Bind(IServiceCollection services, IConfiguration configuration) { ConfigurationUnity.Bind <GlobalConfigurationSection>(configuration); ConfigurationUnity.Bind <ProviderConfigurationSection>(configuration); ConfigurationUnity.Bind <ConverterConfigurationSection>(configuration); ConfigurationUnity.Bind <InstanceConfigurationSection>(configuration); }
/// <summary> /// 使用配置实例名创建一个 <see cref="Database"/> 实例对象。 /// </summary> /// <param name="instanceName">配置实例名称。</param> /// <param name="serviceProvider">检索服务提供者。</param> /// <returns>一个 <see cref="Database"/> 实例对象。</returns> public static IDatabase CreateDatabase(string instanceName = null) { var section = ConfigurationUnity.GetSection <InstanceConfigurationSection>(); Guard.NullReference(section, SR.GetString(SRKind.NonInstanceConfigurationSection)); var setting = string.IsNullOrEmpty(instanceName) ? section.Default : section.Settings[instanceName]; Guard.NullReference(setting, SR.GetString(SRKind.InstanceConfigurationInvalid, instanceName)); IDatabase database; if (setting.DatabaseType != null) { if (setting.Clusters.Count > 0) { database = setting.DatabaseType.New <IDatabase>(GetDistributedConnections(setting), null); } else { database = setting.DatabaseType.New <IDatabase>((ConnectionString)setting.ConnectionString, null); } } else { database = CreateDatabase(setting); } if (DatabaseScope.Current != null) { DatabaseScope.Current.InstanceName = instanceName; } return(database.TryUseContainer()); }
/// <summary> /// 在 <see cref="IServiceCollection"/> 上注册 Fireasy 容器里的定义。 /// </summary> /// <param name="services"></param> /// <param name="containerName">容器名称。</param> /// <returns></returns> public static IServiceCollection AddIoc(this IServiceCollection services, string containerName = null) { Guard.ArgumentNull(services, nameof(services)); var section = ConfigurationUnity.GetSection <ContainerConfigurationSection>(); if (section == null) { return(services); } var setting = string.IsNullOrEmpty(containerName) ? section.Default : section.Settings[containerName]; if (setting == null) { return(services); } foreach (var reg in setting.Registrations) { if (reg.Assembly != null) { Helpers.DiscoverAssembly(reg.Assembly, (svrType, implType, lifetime) => Register(services, svrType, implType, GetLifetime(lifetime))); } else { Register(services, reg.ServiceType, reg.ImplementationType, GetLifetime(reg.Lifetime)); } } return(services); }
/// <summary> /// 尝试获取指定表达式的缓存。 /// </summary> /// <param name="expression"></param> /// <param name="func">当缓存不存在时,创建缓存数据的函数。</param> /// <returns></returns> internal static Delegate TryGetDelegate(Expression expression, Func <LambdaExpression> func) { if (!CachaebleChecker.Check(expression)) { return(func().Compile()); } var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var option = section == null ? TranslateOptions.Default : section.Options; if (!option.ParseCacheEnabled) { return(func().Compile()); } var lazy = new Lazy <Delegate>(() => { //将表达式内的 Segment 替换成参数 var segParExp = Expression.Parameter(typeof(IDataSegment), "g"); var lambdaExp = func() as LambdaExpression; var newExp = SegmentReplacer.Repalce(lambdaExp.Body, segParExp); lambdaExp = Expression.Lambda(newExp, lambdaExp.Parameters[0], segParExp); return(lambdaExp.Compile()); }); var cacheKey = ExpressionKeyGenerator.GetKey(expression, "Trans"); return(MemoryCacheManager.Instance.TryGet(cacheKey, () => lazy.Value, () => new RelativeTime(TimeSpan.FromSeconds(option.ParseCacheExpired)))); }
/// <summary> /// 获取表达式的执行计划。 /// </summary> /// <param name="expression"></param> /// <returns></returns> public Expression GetExecutionPlan(Expression expression) { try { if (expression is LambdaExpression lambda) { expression = lambda.Body; } var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var trans = service.InitializeContext.Provider.GetTranslateProvider(); var options = GetTranslateOptions(); using (var scope = new TranslateScope(service, trans, options)) { var translation = trans.Translate(expression); var translator = trans.CreateTranslator(); return(ExecutionBuilder.Build(translation, e => translator.Translate(e))); } } catch (Exception ex) { throw new TranslateException(expression, ex); } }
internal static IServiceCollection AddLocker(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <LockerConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { return(services); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } services.AddSingleton(typeof(IDistributedLocker), ((LockerConfigurationSetting)setting).LockerType); } return(services); }
/// <summary> /// 根据应用程序配置,创建一个分布式锁。 /// </summary> /// <param name="configName">应用程序配置项的名称。</param> /// <returns><paramref name="configName"/>为配置项对应的 <see cref="IDistributedLocker"/> 实例。</returns> public static IDistributedLocker CreateLocker(string configName = null) { IDistributedLocker locker; IConfigurationSettingItem setting = null; var section = ConfigurationUnity.GetSection <LockerConfigurationSection>(); if (section != null && section.Factory != null) { locker = ConfigurationUnity.Cached <IDistributedLocker>($"Locker_{configName}", () => section.Factory.CreateInstance(configName) as IDistributedLocker); if (locker != null) { return(locker); } } if (string.IsNullOrEmpty(configName)) { if (section == null || (setting = section.GetDefault()) == null) { throw new NotSupportedException(); } } else if (section != null) { setting = section.GetSetting(configName); } if (setting == null) { return(null); } return(ConfigurationUnity.Cached <IDistributedLocker>($"Locker_{configName}", () => ConfigurationUnity.CreateInstance <LockerConfigurationSetting, IDistributedLocker>(setting, s => s.LockerType))); }
/// <summary> /// 尝试获取指定表达式的缓存。 /// </summary> /// <param name="expression"></param> /// <param name="func">当缓存不存在时,创建缓存数据的函数。</param> /// <returns></returns> internal static Delegate TryGetDelegate(Expression expression, Func <LambdaExpression> func) { var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var option = section == null ? TranslateOptions.Default : section.Options; var result = CacheableChecker.Check(expression); if (!result.Required || (result.Enabled == null && !option.CacheParsing) || result.Enabled == false) { return(func().Compile()); } var cacheKey = ExpressionKeyGenerator.GetKey(expression, "Trans"); cacheKey = NativeCacheKeyContext.GetKey(cacheKey); return(MemoryCacheManager.Instance.TryGet(cacheKey, () => { var lambdaExp = func() as LambdaExpression; var segment = SegmentFinder.Find(expression); if (segment != null) { //将表达式内的 Segment 替换成参数 var segParExp = Expression.Parameter(typeof(IDataSegment), "g"); var newExp = SegmentReplacer.Repalce(lambdaExp.Body, segParExp); var parameters = new List <ParameterExpression>(lambdaExp.Parameters); parameters.Insert(1, segParExp); lambdaExp = Expression.Lambda(newExp, parameters.ToArray()); } return lambdaExp.Compile(); }, () => new RelativeTime(result.Expired ?? TimeSpan.FromSeconds(option.CacheParsingTimes)))); }
/// <summary> /// 判断指定的类型是否支持转换。 /// </summary> /// <param name="conversionType"></param> /// <returns></returns> public static bool CanConvert(Type conversionType) { //从配置里找 IValueConverter 对象 var section = ConfigurationUnity.GetSection <ConverterConfigurationSection>(); if (section != null) { var setting = section.Settings.FirstOrDefault(s => s.Value.SourceType == conversionType).Value; if (setting != null) { return(true); } } if (conversionType.IsArray || conversionType == typeof(Color) || conversionType == typeof(Point) || conversionType == typeof(Rectangle) || conversionType == typeof(Size) #if !NETSTANDARD || conversionType == typeof(Image) || conversionType == typeof(Bitmap) || conversionType == typeof(Font) #endif || typeof(Exception).IsAssignableFrom(conversionType)) { return(true); } return(false); }
/// <summary> /// 获取表达式的执行计划。 /// </summary> /// <param name="expression"></param> /// <param name="option"></param> /// <returns></returns> public Expression GetExecutionPlan(Expression expression, TranslateOptions option = null) { try { LambdaExpression lambda = expression as LambdaExpression; if (lambda != null) { expression = lambda.Body; } var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var package = GetTranslateProvider(); var options = option ?? (section != null ? section.Options : TranslateOptions.Default); using (var scope = new TranslateScope(context, package)) { var translation = package.Translate(expression, options); return(package.BuildExecutionPlan(translation, options)); } } catch (Exception ex) { throw new TranslateException(expression, ex); } }
private static void ConfigureContainer(string name, Container container) { var section = ConfigurationUnity.GetSection <ContainerConfigurationSection>(); ContainerConfigurationSetting setting; if (section == null) { return; } if (name == DEFAULT && section.Default != null) { setting = section.Default; } else if ((setting = section.Settings[name]) == null) { return; } foreach (var reg in setting.Registrations) { if (reg.ServiceType != null && reg.ComponentType != null) { container.Register(reg.ServiceType, reg.ComponentType, reg.Singleton ? Lifetime.Singleton : Lifetime.Instance); } } }
public static IServiceCollection AddTaskScheduler(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <TaskScheduleConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { services.AddSingleton(typeof(ITaskScheduler), sp => CreateScheduler(sp)); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } var tsset = (TaskScheduleConfigurationSetting)setting; services.AddSingleton(typeof(ITaskScheduler), sp => CreateScheduler(sp, tsset.Name)); services.TryAddEnumerable( ServiceDescriptor.Singleton <IHostedService, ITaskScheduler>(sp => sp.GetService <ITaskScheduler>())); } return(services); }
public static IServiceCollection AddSerializer(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <SerializerConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { return(services); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } services.AddSingleton(typeof(ISerializer), sp => CreateSerializer(sp, ((SerializerConfigurationSetting)setting).Name)); } return(services); }
/// <summary> /// 根据应用程序配置,创建文本序列化器。 /// </summary> /// <param name="configName">应用程序配置项的名称。</param> /// <returns><paramref name="configName"/>缺省时,如果应用程序未配置,则为 <see cref="MemoryCacheManager"/>,否则为配置项对应的 <see cref="ICacheManager"/> 实例。</returns> public static ITextSerializer CreateSerializer(string configName = null) { ITextSerializer serializer; IConfigurationSettingItem setting = null; var section = ConfigurationUnity.GetSection <SerializerConfigurationSection>(); if (section != null && section.Factory != null) { serializer = section.Factory.CreateInstance(configName) as ITextSerializer; if (serializer != null) { return(serializer); } } if (string.IsNullOrEmpty(configName)) { if (section == null || (setting = section.GetDefault()) == null) { return(null); } } else if (section != null) { setting = section.GetSetting(configName); } if (setting == null) { return(null); } return(ConfigurationUnity.CreateInstance <SerializerConfigurationSetting, ITextSerializer>(setting, s => s.SerializerType)); }
internal static IServiceCollection AddCaching(this IServiceCollection services) { var section = ConfigurationUnity.GetSection <CachingConfigurationSection>(); if (section == null) { return(services); } var setting = section.GetDefault(); if (setting == null) { services.AddSingleton(typeof(ICacheManager), MemoryCacheManager.Instance); } else { if (setting is ExtendConfigurationSetting extend) { setting = extend.Base; } services.AddSingleton(typeof(ICacheManager), ((CachingConfigurationSetting)setting).CacheType); } return(services); }
private static void ConfigureContainer(string name, Container container) { var section = ConfigurationUnity.GetSection <ContainerConfigurationSection>(); IConfigurationSettingItem setting; if (section == null) { return; } if (name == DEFAULT && section.Default != null) { setting = section.Default; } else if ((setting = section.Settings[name]) == null) { return; } foreach (var reg in ((ContainerConfigurationSetting)setting).Registrations) { if (reg.Assembly != null) { container.RegisterAssembly(reg.Assembly, reg.Singleton ? Lifetime.Singleton : Lifetime.Transient); } else if (reg.ServiceType != null && reg.ImplementationType != null) { container.Register(reg.ServiceType, reg.ImplementationType, reg.Singleton ? Lifetime.Singleton : Lifetime.Transient); } } }
/// <summary> /// 尝试从配置文件中配置 <see cref="EntityContextOptions"/> 实例。 /// </summary> /// <param name="options"></param> protected virtual void TryPaserInstanceSetting(EntityContextOptions options) { if (options.Provider == null && options.ConnectionString == null) { var section = ConfigurationUnity.GetSection <InstanceConfigurationSection>(); if (section != null) { IInstanceConfigurationSetting setting; if (!string.IsNullOrEmpty(options.ConfigName)) { setting = section.Settings[options.ConfigName]; } else { setting = section.Default; } if (setting != null) { options.Provider = ProviderHelper.GetDefinedProviderInstance(setting); options.ConnectionString = setting.ConnectionString; } } } }
/// <summary> /// 根据对象类型创建相应的转换器。 /// </summary> /// <param name="conversionType">要转换的数据类型。</param> /// <returns>返回一个 <see cref="IValueConverter"/> 实例,如果未找到对应的转换器,则返回 null。</returns> public static IValueConverter GetConverter(Type conversionType) { //从配置里找 IValueConverter 对象 var section = ConfigurationUnity.GetSection <ConverterConfigurationSection>(); if (section != null) { var setting = section.Settings.FirstOrDefault(s => s.Value.SourceType == conversionType).Value; if (setting != null) { return(setting.ConverterType.New <IValueConverter>()); } } if (conversionType.IsArray) { return(new ArrayConverter(conversionType.GetElementType())); } if (conversionType == typeof(Color)) { return(new ColorConverter()); } if (conversionType == typeof(Point)) { return(new PointConverter()); } if (conversionType == typeof(Rectangle)) { return(new RectangleConverter()); } if (conversionType == typeof(Size)) { return(new SizeConverter()); } #if !NETSTANDARD if (conversionType == typeof(Image) || conversionType == typeof(Bitmap)) { return(new ImageConverter()); } if (conversionType == typeof(Font)) { return(new FontConverter()); } #endif if (typeof(Exception).IsAssignableFrom(conversionType)) { return(new ExceptionConverter()); } return(null); }
/// <summary> /// 判断是否被缓存。 /// </summary> /// <param name="expression"></param> /// <returns></returns> internal static bool CanCache(Expression expression) { var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>(); var option = section == null ? TranslateOptions.Default : section.Options; var result = CacheableChecker.Check(expression); return(typeof(IQueryable).IsAssignableFrom(expression.Type) && (result.Enabled == true || (result.Enabled == null && option.CacheExecution))); }
/// <summary> /// 初始化 <see cref="RedisLocker"/> 类的新实例。 /// </summary> /// <param name="options"></param> public RedisLocker(IServiceProvider serviceProvider, IOptionsMonitor <RedisDistributedLockerOptions> options) : this(serviceProvider) { RedisConfigurationSetting setting = null; var optValue = options.CurrentValue; if (!optValue.IsConfigured()) { var section = ConfigurationUnity.GetSection <LockerConfigurationSection>(); var matchSetting = section.Settings.FirstOrDefault(s => s.Value.LockerType == typeof(RedisLocker)).Value; if (matchSetting != null && section.GetSetting(matchSetting.Name) is ExtendConfigurationSetting extSetting) { setting = (RedisConfigurationSetting)extSetting.Extend; } else { throw new InvalidOperationException($"未发现与 {typeof(RedisLocker).FullName} 相匹配的配置。"); } } else { if (!string.IsNullOrEmpty(optValue.ConfigName)) { var section = ConfigurationUnity.GetSection <LockerConfigurationSection>(); if (section != null && section.GetSetting(optValue.ConfigName) is ExtendConfigurationSetting extSetting) { setting = (RedisConfigurationSetting)extSetting.Extend; } else { throw new InvalidOperationException($"无效的配置节: {optValue.ConfigName}。"); } } else { setting = new RedisConfigurationSetting { Password = optValue.Password, ConnectionString = optValue.ConnectionString, DefaultDb = optValue.DefaultDb, ConnectTimeout = optValue.ConnectTimeout, LockTimeout = optValue.LockTimeout, SyncTimeout = optValue.SyncTimeout, WriteBuffer = optValue.WriteBuffer, PoolSize = optValue.PoolSize, SerializerType = optValue.SerializerType, Ssl = optValue.Ssl, Twemproxy = optValue.Twemproxy }; RedisHelper.ParseHosts(setting, optValue.Hosts); } } if (setting != null) { (this as IConfigurationSettingHostService).Attach(setting); } }