ABP Vnext 引入JSON配置文件(AddJsonFile)的方法

ABP Vnext 引入外部JSON配置文件(AddJsonFile)的方法。

包括ABP通過JSON配置文件進行動態注入依賴

 public class WPFAppModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var configuration = BuildConfiguration();
            //var configuration = context.Services.GetConfiguration();

            context.Services.AddFromConfigurationFile(configuration.GetSection("Services"));
   
        }
        private static IConfigurationRoot BuildConfiguration()
        {
            return new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("configuration.json", optional: true, reloadOnChange: true)
                //.AddJsonFile("autofac.json", optional: false, reloadOnChange: true)
                .Build();
        }
    }

//configuration.json文件

{
  //描述:"實現類命名空間+實現類名稱,所在程序集名稱"
  "Services": {
    "Singleton": [

    ],
    "Transient": [
      {
        "Service": "WpfApp1.ISampleService,WpfApp1",
        "Implementation": "WpfApp1.SampleService,WpfApp1"
      }
    ],
    "AddScoped": [

    ]
  }
}

 

ABP通過配置文件進行動態注入

https://blog.csdn.net/xhl_james/article/details/90700217

 

 


namespace WpfApp1
{
    public class ServicesConfiguration
    {
        public IEnumerable<ServiceItem> Singleton { get; set; }
        public IEnumerable<ServiceItem> Transient { get; set; }
        public IEnumerable<ServiceItem> AddScoped { get; set; }
    }
    public class ServiceItem
    {
        public string Service { get; set; }
        public string Implementation { get; set; }
    }
    public static class AddFromConfigurationFileExtension
    {
        /// <summary>
        /// 通過配置文件進行注入實現。
        /// </summary>
        /// <remarks>
        /// 需要注意的是由於通過的配置文件進行配置,那麼要確保接口、實現對應的程序集和
        /// typeof(AddFromConfigurationFileExtension).Assembly程序集同目錄。
        /// 不然Type.GetType會找不到對應的類。
        /// </remarks>
        /// <param name="services"></param>
        /// <param name="configuration"></param>
        /// <returns></returns>
        public static IServiceCollection AddFromConfigurationFile(this IServiceCollection services,
        IConfigurationSection configuration)
        {
            var servicesConfiguration = configuration.Get<ServicesConfiguration>();
            Type @interface = null, implementation = null;
            if (servicesConfiguration.Singleton != null)
            {
                foreach (var service in servicesConfiguration.Singleton)
                {
                    @interface = Type.GetType(service.Service, false);
                    implementation = Type.GetType(service.Implementation, false);
                    if (@interface == null)
                        throw new ArgumentNullException($"{service.Service}未找到。請和管理員聯繫!", nameof(@interface));
                    if (@interface == null)
                        throw new ArgumentNullException($"{service.Implementation}未找到。請和管理員聯繫!", nameof(implementation));
                    services.AddSingleton(@interface, implementation);
                }
            }
            if (servicesConfiguration.Transient != null)
            {
                foreach (var service in servicesConfiguration.Transient)
                {
                    //確保能夠正確註冊。防止影響後面的功能。
                    @interface = Type.GetType(service.Service, false);
                    implementation = Type.GetType(service.Implementation, false);
                    if (@interface == null)
                        throw new ArgumentNullException($"{service.Service}未找到。請和管理員聯繫!", nameof(@interface));
                    if (@interface == null)
                        throw new ArgumentNullException($"{service.Implementation}未找到。請和管理員聯繫!", nameof(implementation));
                    services.AddTransient(@interface, implementation);
                }
            }
            if (servicesConfiguration.AddScoped != null)
            {
                foreach (var service in servicesConfiguration.AddScoped)
                {
                    //確保能夠正確註冊。防止影響後面的功能。
                    @interface = Type.GetType(service.Service, false);
                    implementation = Type.GetType(service.Implementation, false);
                    if (@interface == null)
                        throw new ArgumentNullException($"{service.Service}未找到。請和管理員聯繫!", nameof(@interface));
                    if (@interface == null)
                        throw new ArgumentNullException($"{service.Implementation}未找到。請和管理員聯繫!", nameof(implementation));
                    services.AddScoped(@interface, implementation);
                }
            }
            return services;
        }
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章