前言

net core 项目倾向于使用注入机制来注入服务,这样我们一些写公共组件的很苦老该如何引入一些应该是共有的资源进来,比如IConfiguration。net core 中是startup中注入的,然后需要用的服务类中也通过构造函数注入IConfiguration来再当前服务类中使用。这样会导致注入需要一路注入下去,从底层一直往上到控制器层每一层都要注入下一层服务

但是写公共组件对于开发者来说是个黑盒子,是一个整体封闭性的东西,一般都不会干预调用者必须注入某服务才能使用我这个服务。如此公共组件内部想要直接引入需要注入的服务如读取Appsettings.json配置服务怎么办呢?

解决方案

1.定义静态方法

    /// <summary>
    /// 读取配置文件
    /// </summary>
    public class ConfigurationHelper
    {
        /// <summary>
        /// Gets or sets 注入的IConfiguration
        /// </summary>
        public static IConfiguration Configuration { get; set; }

        /// <summary>
        /// 初始化net core 配置文件
        /// </summary>
        /// <param name="config">注入的IConfiguration</param>
        public static void InitConfig(IConfiguration config)
        {
            Configuration = config;
        }

        /// <summary>
        /// 根据配置文件键读取百望配置
        /// </summary>
        /// <returns>百望配置</returns>
        public static BaiWangConfig GetBaiWangConfig()
        {
            // ConfigurationHelper.Configuration.GetSection("key的名字").GetSection("key的名字").Value 取单个值的方法,具体得看自己的appsetting存放的结构,我这里是二级结构
            var data = Configuration.GetSection("BaiWang").Get<你的配置结构实体>();
            return data;
        }
    }

2.startup.cs中注入上面的方法

ConfigurationHelper.InitConfig(Configuration);

完整代码

         /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="env">IHostingEnvironment</param>
        public Startup(IHostingEnvironment env)
        {
            IConfigurationBuilder builder = new ConfigurationBuilder();

            builder.SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", false, true)
                .AddEnvironmentVariables();

            Configuration = builder.Build();

            // 注入配置服务到其它类库项目中使用
            ConfigurationHelper.InitConfig(Configuration);
        }
  1. 这样就能使用了
ConfigurationHelper.GetBaiWangConfig(); //再需要用的地方这样取值就可以了