【问题标题】:System.InvalidOperationException: The current type, Microsoft.Extensions.Configuration.IConfiguration, is an interface and cannot be constructedSystem.InvalidOperationException:当前类型,Microsoft.Extensions.Configuration.IConfiguration,是一个接口,无法构造
【发布时间】:2021-01-01 15:34:41
【问题描述】:

System.InvalidOperationException:当前类型 Microsoft.Extensions.Configuration.IConfiguration 是一个接口,无法构造。您是否缺少类型映射?

我在 .NET Core 中使用 unity,上面的错误出现在这一行:

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

IServiceB 是这样注册的:

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

我有一个实现 IService B 的类 ServiceA,如下所示。

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 获取的。

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

【问题讨论】:

  • 您是否在容器中注册了IConfiguration 的实现?
  • 构建配置,然后将其注册到容器中。
  • 与其尝试注入整个配置服务,不如构造并注入特定的配置对象

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


【解决方案1】:

假设像 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

【讨论】:

  • 谢谢。这是一个完整的答案。我没有注册 IConfiguration。实际上,我上面的 ServiceA 类是一个配置类,就像您的示例中的 MySetting 一样,在 MySetting 中我不必像下面那样访问配置吗? ` private IConfiguration _configuration;` public ServiceA(IConfiguration configuration): base(configReader) { _configuration = configuration; }`
  • @Cookie 没有。就像我说的那样,如果可能的话,您希望避免注入该接口。建议的方法是提取组合根中需要的内容并填充强类型模型。
猜你喜欢
  • 2012-04-30
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多