System.InvalidOperationException:当前类型Microsoft.Extensions.Configuration.IConfiguration是一个接口,无法构造

问题描述 投票:0回答:1

System.InvalidOperationException:当前类型Microsoft.Extensions.Configuration.IConfiguration是一个接口,无法构造。你错过了类型映射吗?

我使用.NET Core的统一,上面的错误在这一行给出:

container.RegisterInstance<IServiceA>(IoC.Resolve<IServiceB>());

IServiceB注册如下:

container.RegisterType<IServiceB, ServiceA>(new ContainerControlledLifetimeManager());

我有一个ServiceA,它实现了IService B,如下所示。

public class ServiceA : IServiceB
{
   private IConfiguration _configuration;

   public ServiceA(IConfiguration configuration): base(configReader)
   {
        _configuration = configuration;
   }

   public string someVariable => _configuration.GetSection("Section").GetSection("WantedKey").Value;
    ...
}

我正在使用Microsoft.Extensions.Configuration.IConfiguration进行配置。

所以我不知道如何映射它,因为我从Microsoft.Extensions.Configuration.IConfiguration获取它。

我究竟做错了什么?我该如何解决?

c# dependency-injection .net-core unity-container
1个回答
2
投票

假设有一个像config.json这样的文件

{
  "Section" : {
    "WantedKey" : "WantedValue"
  }
}

您首先需要构建配置实例

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .SetBasePath(Directory.GetCurrentDirectory());
    .AddJsonFile("config.json", optional: true, reloadOnChange: true);
    .Build();

并在容器中注册

container.RegisterInstance<IConfiguration>(config);

为了解决IConfiguration的问题。

理想情况下,你真的不应该通过IConfiguration注射。通常在组合根处访问它以获取其他依赖项的设置。尽量避免耦合到外部框架依赖项。

在这种情况下,您需要创建一个强类型来保存所需的设置

public class MySetting {
    public string WantedKey { get; set; }
}

并从配置中填充它的实例

MySetting setting = config.GetSection("Section").Get<MySetting>();

您可以在容器中注册

container.RegisterInstance<MySetting>(setting);

并将其注入家属

public class ServiceA : IServiceB {
    private readonly MySetting setting;

    public ServiceA(MySetting setting) {
        this.setting = setting;
    }

    public string someVariable => setting.WantedKey;
    //...
}

参考Configuration in ASP.NET Core

© www.soinside.com 2019 - 2024. All rights reserved.