【问题标题】:Configure ServiceCollection via JSON file通过 JSON 文件配置 ServiceCollection
【发布时间】:2018-10-23 10:48:56
【问题描述】:

是否有通过包含 interface -> class mappings 的 JSON 文件在 .NET Core 2.0 中配置依赖注入的示例?例如

var someServiceConfigBuilder = new ConfigurationBuilder();
someServiceConfigBuilder.AddJsonFile("someservice.json");
var someServiceConfig = someServiceConfigBuilder.Build();

var services = new ServiceCollection();
services.AddOptions();
services.Configure<SomeServiceOptions>(someServiceConfig);
services
    // TODO this should really come from the JSON config file
    .AddTransient<ISomeService, SomeService>();

因此,与其通过调用 AddTransient() 对映射进行硬编码,不如让这些信息来自 JSON 文件。

支持吗?如果是,JSON 配置的预期格式是什么?

【问题讨论】:

    标签: c# .net dependency-injection .net-core


    【解决方案1】:

    替换默认服务容器

    内置服务容器旨在满足 框架和基于它构建的大多数消费者应用程序。然而, 开发人员可以将内置容器替换为自己喜欢的 容器。 ConfigureServices 方法通常返回 void,但如果 它的签名被更改为返回IServiceProvider,一个不同的 容器可以配置和返回。国际奥委会有很多 可用于 .NET 的容器。

    (强调我的)

    参考:Introduction to Dependency Injection in ASP.NET Core

    因此,我建议检查是否已经有 3rd 方 DI 框架提供该功能并具有可以与 .Net Core 集成的扩展。

    注意

    使用第三方 DI 容器时,必须更改 ConfigureServices,使其返回 IServiceProvider 而不是 void

    【讨论】:

    【解决方案2】:
     public static void Injection(IServiceCollection services)
    
     {
    
      var jsonServices = JObject.Parse(File.ReadAllText("dependency.json"))["services"];
    
      var requiredServices = JsonConvert.DeserializeObject < List < Service >> (jsonServices.ToString());
    
      foreach(var service in requiredServices)
    
      {
    
       var serviceType = Type.GetType(service.ServiceType.Trim() + ", " + service.Assembly.Trim());
    
       var implementationType = Type.GetType(service.ImplementationType.Trim() + ", " + service.Assembly.Trim());
    
       var serviceLifetime = (ServiceLifetime) Enum.Parse(typeof(ServiceLifetime), service.Lifetime.Trim());
    
       var serviceDescriptor = new ServiceDescriptor(serviceType: serviceType,
    
        implementationType: implementationType,
    
        lifetime: serviceLifetime);
    
       services.Add(serviceDescriptor);
    
      }
    

    更多详情请点击here

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2018-05-23
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2017-07-12
      • 2010-12-11
      • 2012-06-27
      • 2021-09-07
      相关资源
      最近更新 更多