当前位置:开发工具->.NET ->asp.net core选项Options模块的笔记

原创版权标志asp.net core选项Options模块的笔记

作者:阿郎  发表时间:2018/5/7 9:14:05  阅读:
[摘要] 这篇博客是写给自己看的。已经不止一次看到AddOptions的出现,不管是在.net core源码还是别人的框架里面,都充斥着AddOptions。于是自己大概研究了下,没有深入,因为,我的功力还是不够,等能力到了再回头研究下。
广告招租:800元/月,QQ:1162839541

    这篇博客是写给自己看的。已经不止一次看到AddOptions的出现,不管是在.net core源码还是别人的框架里面,都充斥着AddOptions。于是自己大概研究了下,没有深入,因为,我的功力还是不够,等能力到了再回头研究下。在这里还是要说一遍,因为DI的重要性不言而喻,不必谈的太深,说下自己的理解: 

    DI实现其实很简单,首先设计类来实现接口,而不是把所有的程序逻辑写在一个类文件中,然后我们传入一个接口和一个继承自接口的类作为参数,然后我们在相应的函数那将泛型参数T作为形参,伪代码:

    //调用部分

    HandleDI<ITest, Test>

    //实现部分

    HandleDI<TInterface, T>

    // 使用反射,EMIT,委托来实例化T创建TInterface的对象

    然后我们使用反射或者EMIT或是委托TInterface对象。这就是DI的实现过程。

    DI说白了,作用就是 解耦的 实例化继承自接口的类

    如果在程序中基于IOptions<TOptions>实现了你自己的选项配置类,最好就是调用AddOptions完成Options的几个重要对象的实例化。

    AddOptions:
    

        完成几个重要的Options对象的实例化:     

    

public static IServiceCollection AddOptions(this IServiceCollection services)
{
 if (services == null)
 {
 throw new ArgumentNullException(nameof(services));
 }

 services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>)));
 services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>)));
 services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>)));
 services.TryAdd(ServiceDescriptor.Transient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>)));
 services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>)));
 return services;
}
Configure: 完成的是TOption类的实例化过程,最终调用AddSingleton做DI。    

    

/// <summary>
 /// Registers an action used to configure a particular type of options.
 /// Note: These are run before all <seealso cref="PostConfigure{TOptions}(IServiceCollection, Action{TOptions})"/>.
 /// </summary>
 /// <typeparam name="TOptions">The options type to be configured.</typeparam>
 /// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
 /// <param name="configureOptions">The action used to configure the options.</param>
 /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
 public static IServiceCollection Configure<TOptions>(this IServiceCollection services, Action<TOptions> configureOptions) where TOptions : class
 => services.Configure(Options.Options.DefaultName, configureOptions);

 /// <summary>
 /// Registers an action used to configure a particular type of options.
 /// Note: These are run before all <seealso cref="PostConfigure{TOptions}(IServiceCollection, Action{TOptions})"/>.
 /// </summary>
 /// <typeparam name="TOptions">The options type to be configured.</typeparam>
 /// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
 /// <param name="name">The name of the options instance.</param>
 /// <param name="configureOptions">The action used to configure the options.</param>
 /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
 public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, Action<TOptions> configureOptions)
 where TOptions : class
 {
 if (services == null)
 {
 throw new ArgumentNullException(nameof(services));
 }

 if (configureOptions == null)
 {
 throw new ArgumentNullException(nameof(configureOptions));
 }

 services.AddOptions();
 services.AddSingleton<IConfigureOptions<TOptions>>(new ConfigureNamedOptions<TOptions>(name, configureOptions));
 return services;
 }
        

            这两个的实现,都是IOC的功劳,如果不去深究其作用,单单就是看代码,其实就是DI的实例化接口类。         

        

            参考文章: ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor        

        

            .NET Core采用的全新配置系统[1]: 读取配置数据        

    

文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)