亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[Asp.net 5] Options-配置文件之后的配置

2019-11-17 02:09:17
字體:
來源:轉載
供稿:網友

[asp.net 5] Options-配置文件之后的配置

今天要講的是OptionsModel解決方案,整個解決方案中也只有Microsoft.Framework.OptionsModel一個工程。按照表面文字OptionsModel應該翻譯成選項模型,但是這個詞沒表現它實際的含義,我覺得稱呼它為配置選項好些,不過為了原滋原味,我們還是用英文的:Configuration和OptionsModel表示它們。

什么是OptionsModel

在之前的配置文件一節([Asp.net 5] Configuration-新一代的配置文件)我們介紹過配置文件最后生成的是IConfiguration對象,但是IConfiguration可能包含很多信息混雜在一起。比如設置日志的等級Level、連接數據庫的字符串connectionstring等。我們有時候不希望直接使用IConfiguration對象(比如對象中的配置項會變動),而是抽取一部分有用的信息以及一些其他值構成的具體的實體對象,那么這個從配置文件之后抽取的配置,就可以叫做OptionsModel。

簡而言之:IConfiguration是配置文件的抽象;OptionsModel配置文件之后的配置,是直接對于系統的配置項。

OptionsModel的特點與實現

這類對象的特點很明顯一般都是只包含一些屬性,并無具體的內部邏輯;但是這種配置可能不是僅有一個:比如有數據庫的connectionModel,而日志可能有LogOption。而且讓這些OptionsModel實現統一的接口也不是現實的,也沒有實際意義。那么如何實現Configuration到OptionsModel的轉換呢?

答案很簡單:Binder(神奇的Binder)。

        [Fact]        public void CanReadComplexPRoperties()        {            var dic = new Dictionary<string, string>            {                {"Integer", "-2"},                {"Boolean", "TRUe"},                {"Nested:Integer", "11"}            };            var builder = new ConfigurationBuilder(new MemoryConfigurationSource(dic));            var config = builder.Build();            var options = ConfigurationBinder.Bind<ComplexOptions>(config);            Assert.True(options.Boolean);            Assert.Equal(-2, options.Integer);            Assert.Equal(11, options.Nested.Integer);        }

如何DI?

很多工程使用了DependencyInjection(依賴注入),而OptionsModel是比較基礎的配置,幾乎可以肯定內部用到OptionsModel的類會被注入,并且使用類型注冊的方式注入。那么DependencyInjection內部肯定會遞歸到OptionsModel類,所以OptionsModel類也必須要進行注入,那么如何實現?

答曰:使用實例(Instance)直接注入到該類類型。[services.AddInstance(serviceType, type.Assembly.CreateInstance(type));]

如果我對于多個OptionsModel注冊,但是我可以通過命名方式注入,還可以進行排序,那又該如何實現?

答曰:Microsoft.Framework.OptionsModel。

Microsoft.Framework.OptionsModel

類文件分類

在Microsoft.Framework.OptionsModel中,使用泛型的方式進行注入,之后以泛型的方式獲取注入;但是注入的類和獲取的泛型類確是不完全一致的。

  • 注入的類和接口:IConfigureOptions<in TOptions>、ConfigureOptions<TOptions>、ConfigureFromConfigurationOptions<TOptions>
  • 獲取注入的類和接口:IOptions<out TOptions>、OptionsManager<TOptions>
  • 注冊的擴展類:OptionsServiceCollectionExtensions
  • 其他:OptionsConstants

注入類和接口

IConfigureOptions<in TOptions>、ConfigureOptions<TOptions>、ConfigureFromConfigurationOptions<TOptions>這幾個類和接口的關系為:

    public interface IConfigureOptions<in TOptions>    {        int Order { get; }        void Configure(TOptions options, string name = "");    }
IConfigureOptions
    public class ConfigureOptions<TOptions> : IConfigureOptions<TOptions>    {        public ConfigureOptions([NotNull]Action<TOptions> action)        {            Action = action;        }        public Action<TOptions> Action { get; private set; }        public string Name { get; set; } = "";        public virtual int Order { get; set; } = OptionsConstants.DefaultOrder;        public virtual void Configure([NotNull]TOptions options, string name = "")        {            // Always invoke the action if no Name was specified, otherwise only if it was the requested name            if (string.IsNullOrEmpty(Name) || string.Equals(name, Name, StringComparison.OrdinalIgnoreCase))            {                Action.Invoke(options);            }        }    }
ConfigureOptions
    public class ConfigureFromConfigurationOptions<TOptions> : ConfigureOptions<TOptions>    {        public ConfigureFromConfigurationOptions([NotNull] IConfiguration config)            : base(options => ConfigurationBinder.Bind(options, config))        {        }    }
ConfigureFromConfigurationOptions

注入類和接口的注入

在OptionsServiceCollectionExtensions中提供了三種注冊方式(實際是七個方法和重載):

  • 直接注冊實現IConfigureOptions<in TOptions>類型的數據。(假設實現類的類型為OptionsDev,則實際注冊[services.AddTransient(IConfigureOptions<T>,OptionsDev)])
  • 提供Action<TOptions>進行注冊。(創建實例instanceA=new ConfigureOptions<TOptions>(setupAction),之后注冊[services.AddInstance(IConfigureOptions<T>,configureInstance)])
  • 提供IConfiguration進行注冊。(創建實例instanceA=new ConfigureFromConfigurationOptions<TOptions>(setupAction),之后注冊[services.AddInstance(IConfigureOptions<T>, configureInstance)])
    public static class OptionsServiceCollectionExtensions    {        public static IServiceCollection AddOptions([NotNull]this IServiceCollection services)        {            services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>)));            return services;        }        private static bool IsAction(Type type)        {            return (type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Action<>));        }        private static IEnumerable<Type> FindIConfigureOptions(Type type)        {            var serviceTypes = type.GetTypeInfo().ImplementedInterfaces                .Where(t => t.GetTypeInfo().IsGenericType && t.GetGenericTypeDefinition() == typeof(IConfigureOptions<>));            if (!serviceTypes.Any())            {                string error = "TODO: No IConfigureOptions<> found.";                if (IsAction(type))                {                    error += " did you mean Configure(Action<T>)";                }                throw new InvalidOperationException(error);            }            return serviceTypes;        }        public static IServiceCollection ConfigureOptions([NotNull]this IServiceCollection services, Type configureType)        {            var serviceTypes = FindIConfigureOptions(configureType);            foreach (var serviceType in serviceTypes)            {                services.AddTransient(serviceType, configureType);            }            return services;        }        public static IServiceCollection ConfigureOptions<TSetup>([NotNull]this IServiceCollection services)        {            return services.ConfigureOptions(typeof(TSetup));        }        public static IServiceCollection ConfigureOptions([NotNull]this IServiceCollection services, [NotNull]object configureInstance)        {            var serviceTypes = FindIC
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品视频中文字幕| 欧美精品性视频| 日韩中文在线观看| 日韩成人网免费视频| 欧美亚洲另类视频| 国产精品第二页| 国产这里只有精品| 97免费视频在线播放| 久久中文精品视频| 日韩精品一区二区视频| 亚洲精品中文字| 国产精品九九九| 日韩欧美第一页| 永久免费毛片在线播放不卡| 亚洲精品美女久久久久| 欧美日韩亚洲视频| 国产小视频91| 在线观看日韩欧美| 日韩成人av一区| 国产高清视频一区三区| 亚洲网站在线播放| 九九热这里只有精品免费看| 亚洲sss综合天堂久久| 国产成人综合一区二区三区| 久久中国妇女中文字幕| 日韩亚洲欧美中文高清在线| 萌白酱国产一区二区| 国产区精品视频| 91美女片黄在线观| 97高清免费视频| 精品中文字幕在线观看| 亚洲专区在线视频| 日韩欧美高清视频| 欧美日韩ab片| 国产精品极品在线| 69久久夜色精品国产69乱青草| 午夜精品福利视频| 欧美精品免费播放| 色综合91久久精品中文字幕| 一区二区三区国产在线观看| 欧美在线观看网址综合| 精品视频在线导航| 夜夜嗨av一区二区三区免费区| 综合国产在线观看| 欧美亚洲日本黄色| 欧美性xxxx极品高清hd直播| 久久久www成人免费精品| 国产视频精品va久久久久久| 一区二区三区动漫| 亚洲xxxx在线| 久久久精品2019中文字幕神马| 国产精品视频在线播放| 69av在线视频| 欧美丝袜一区二区三区| 国产精品人成电影| 亚洲国产中文字幕久久网| 久久久亚洲欧洲日产国码aⅴ| 亚洲男人的天堂网站| 久久久久久亚洲| 国产成人拍精品视频午夜网站| 日韩成人在线视频| 欧美大肥婆大肥bbbbb| 国内精品久久久久伊人av| 欧美极品少妇xxxxⅹ喷水| 日韩精品免费看| 日本成人激情视频| 日韩免费观看高清| 97久久精品在线| 日韩欧美在线视频免费观看| 精品久久久精品| 久久久99久久精品女同性| 亚洲色图美腿丝袜| 久久影院资源站| 一区二区三区四区视频| 亚洲新中文字幕| 久久色在线播放| 欧美夫妻性生活视频| 亚洲成人a**站| 久久久久久久成人| 亚洲欧美三级伦理| 国产一区二区三区视频| 国产精品av在线| 日韩黄色高清视频| 国模gogo一区二区大胆私拍| 国产精品精品一区二区三区午夜版| 精品久久久久久久久久久久久久| 国产成人精品视| 国产网站欧美日韩免费精品在线观看| 欧美专区第一页| 亚洲免费视频一区二区| 日韩av片永久免费网站| 亚洲男人天堂网站| 福利一区福利二区微拍刺激| 国产亚洲激情视频在线| 欧美激情中文字幕乱码免费| 久久露脸国产精品| 日韩av免费观影| 人人澡人人澡人人看欧美| 精品日本高清在线播放| 亚洲精品suv精品一区二区| 日韩少妇与小伙激情| 亚洲自拍偷拍第一页| 91精品一区二区| 亚洲自拍偷拍一区| 青青草99啪国产免费| 日韩中文字在线| 日韩av手机在线| 中文字幕日韩专区| 国产精品久久久久福利| 91精品国产综合久久久久久久久| 亚洲欧洲免费视频| 国产一级揄自揄精品视频| 欧美大学生性色视频| 国产经典一区二区| 一区二区在线免费视频| 在线播放国产一区中文字幕剧情欧美| 国产极品jizzhd欧美| 亚洲第一视频网| 国产成人精品久久久| 国产精品高清免费在线观看| 国产最新精品视频| 日韩最新中文字幕电影免费看| 精品久久久av| 懂色aⅴ精品一区二区三区蜜月| 日韩在线视频中文字幕| 日韩av网址在线| 亚洲精品电影在线观看| 欧美裸体xxxxx| 麻豆国产va免费精品高清在线| 欧美性理论片在线观看片免费| 美女性感视频久久久| 国产精品揄拍一区二区| 日本国产高清不卡| 欧美自拍大量在线观看| 国产精品久久久久久久久久久久| 成人网在线免费观看| 亚洲欧美一区二区三区四区| 亚洲第一页在线| 亚洲aa中文字幕| 国产亚洲精品久久久优势| 色综合久久88色综合天天看泰| 亚洲欧美精品一区| 亚洲成人1234| 久久九九国产精品怡红院| 日韩av免费在线播放| 日韩中文字幕精品视频| 国产一区二区日韩精品欧美精品| 日韩男女性生活视频| 欧美诱惑福利视频| 中文字幕久热精品视频在线| 欧美精品在线免费播放| 秋霞av国产精品一区| 久久精品这里热有精品| 久久激情视频久久| 欧美极品美女电影一区| 欧美成人黄色小视频| 欧美xxxx做受欧美| 韩国国内大量揄拍精品视频| 亚洲国产精品999| 国产精品国产自产拍高清av水多| 久久久国产精品亚洲一区| 尤物99国产成人精品视频| 亚洲综合色激情五月| 中文字幕一区二区三区电影|