如何将依赖注入与.Net Core中的配置绑定结合在一起?

问题描述

我之前并没有真正使用过依赖注入,但是它似乎非常适合我现在正在构建的.Net Core项目。这是一个容器化的非ASP服务(因此本质上是一个控制台应用程序),其配置由一个如下所示的JSON文件驱动:

{
  "Routes": [
    {
      "Name": "What's in a name?","Description": "This is a description","Source": {
        "Path": "SomePath/Read"
      },"Destination": {
        "Path": "SomePath/Write"
      }
    }
  ]
}

Routes可以指定n条路由。每个人都应解析为一个Route强类型对象,并且Source和Destination部分应分别解析为一个强类型FileLocation对象,而无需手动映射到JSON字段名称。下面的代码实现了这一点(使用顶级Routes类来包含列表)

new ConfigurationBuilder()
    .AddJsonFile(FileRoutesConfigFile,optional: false,reloadOnChange: true)
    .Build()
    .Get<Routes>()

但是,我想让配置类受益于Microsoft DependencyInjection框架来获取应用程序服务(例如,FileLocation这样的东西):

public class FileLocation {
    public string Path { get; set; }
    private IAppConfiguration AppConfiguration { get; }

    public FileLocation(IAppConfiguration appConfiguration) {
        AppConfiguration = appConfiguration;
    }
}

我看不到做到这一点的方法(当没有无参数的构造函数时,它会完全失败)。我是否需要使用其他DI框架,或者是否可以通过可用的第一方框架来完成此任务?

解决方法

我认为Autofac或Scrutor可能会有所帮助。 IServiceCollection可能没有它。

,

一种方法是使用HostBuilder类。 Here,您可以找到一个示例。

,

我最终采用的方法是将选项分为严格的POCO类,然后创建工厂以产生更复杂的业务类作为输入。工厂可以由服务提供商构建,并注入到需要生成JSON配置的类的类中。例如,我的一个工厂看起来像这样:

public interface IBusinessClassFactory
{
    IBusinessClass GetBusinessClass(BusinessClassConfig config);
}

public class BusinessClassFactory : IBusinessClassFactory
{
    public BusinessClassFactory(AppConfig appConfig,ISubclassFactory subclassFactory,IServiceProvider serviceProvider)
    {
        AppConfig = appConfig;
        SubclassFactory = subclassFactory;
        ServiceProvider = serviceProvider;
    }

    public AppConfig AppConfig { get; }
    public ISubclassFactory SubclassFactory { get; }
    public IServiceProvider ServiceProvider { get; }

    public IBusinessClass GetBusinessClass(BusinessClassConfig config)
    {
        var logger = ServiceProvider.GetRequiredService<ILogger<FileLocation>>();
        return new BusinessClass(logger,AppConfig,SubclassFactory,config);
    }
}

这样,我仍然可以将各个类彼此隔离以进行单元测试,并且可以将大多数依赖关系图保留在较高的级别。