From 46e98339480d853fc78a014c34d7ff9fcaf13890 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期四, 05 十二月 2024 14:09:02 +0800
Subject: [PATCH] 产线协议

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_Core/Core/ConfigurableOptions.cs |   66 +++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Core/ConfigurableOptions.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Core/ConfigurableOptions.cs"
new file mode 100644
index 0000000..a313a78
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Core/ConfigurableOptions.cs"
@@ -0,0 +1,66 @@
+锘縰sing Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_Core.Core
+{
+    public static class ConfigurableOptions
+    {
+        /// <summary>娣诲姞閫夐」閰嶇疆</summary>
+        /// <typeparam name="TOptions">閫夐」绫诲瀷</typeparam>
+        /// <param name="services">鏈嶅姟闆嗗悎</param>
+        /// <returns>鏈嶅姟闆嗗悎</returns>
+        public static IServiceCollection AddConfigurableOptions<TOptions>(this IServiceCollection services)
+            where TOptions : class, IConfigurableOptions
+        {
+            Type optionsType = typeof(TOptions);
+            string path = GetConfigurationPath(optionsType);
+            services.Configure<TOptions>(App.Configuration.GetSection(path));
+
+            return services;
+        }
+
+        public static IServiceCollection AddConfigurableOptions(this IServiceCollection services, Type type)
+        {
+            string path = GetConfigurationPath(type);
+            var config = App.Configuration.GetSection(path);
+
+            Type iOptionsChangeTokenSource = typeof(IOptionsChangeTokenSource<>);
+            Type iConfigureOptions = typeof(IConfigureOptions<>);
+            Type configurationChangeTokenSource = typeof(ConfigurationChangeTokenSource<>);
+            Type namedConfigureFromConfigurationOptions = typeof(NamedConfigureFromConfigurationOptions<>);
+            iOptionsChangeTokenSource = iOptionsChangeTokenSource.MakeGenericType(type);
+            iConfigureOptions = iConfigureOptions.MakeGenericType(type);
+            configurationChangeTokenSource = configurationChangeTokenSource.MakeGenericType(type);
+            namedConfigureFromConfigurationOptions = namedConfigureFromConfigurationOptions.MakeGenericType(type);
+
+            services.AddOptions();
+            services.AddSingleton(iOptionsChangeTokenSource,
+                Activator.CreateInstance(configurationChangeTokenSource, Options.DefaultName, config) ?? throw new InvalidOperationException());
+            return services.AddSingleton(iConfigureOptions,
+                Activator.CreateInstance(namedConfigureFromConfigurationOptions, Options.DefaultName, config) ?? throw new InvalidOperationException());
+        }
+
+        /// <summary>鑾峰彇閰嶇疆璺緞</summary>
+        /// <param name="optionsType">閫夐」绫诲瀷</param>
+        /// <returns></returns>
+        public static string GetConfigurationPath(Type optionsType)
+        {
+            var endPath = new[] { "Option", "Options" };
+            var configurationPath = optionsType.Name;
+            foreach (var s in endPath)
+            {
+                if (configurationPath.EndsWith(s))
+                {
+                    return configurationPath[..^s.Length];
+                }
+            }
+
+            return configurationPath;
+        }
+    }
+}

--
Gitblit v1.9.3