通过JSON文件配置ServiceCollection

时间:2018-05-13 18:04:08

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

是否有通过包含 interface - >的JSON文件在.NET Core 2.0中配置依赖项注入的示例类映射? E.g。

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配置的预期格式是什么?

2 个答案:

答案 0 :(得分:3)

  

替换默认服务容器

     

内置服务容器旨在满足基本需求   框架和构建在其上的大多数消费者应用程序。然而,   开发人员可以用他们的首选替换内置容器   容器。 ConfigureServices方法通常返回void,但是如果   它的签名被更改为返回IServiceProvider,不同   容器可以配置和返回。有很多IOC   可用于.NET的容器。

(强调我的)

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

有了这个我会建议检查是否已经有第三方DI框架提供该功能,并且有一个可以与.Net Core集成的扩展。

  

注意

     

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

答案 1 :(得分:0)

 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