System.InvalidOperationException: текущий тип, Microsoft.Extensions.Configuration.IConfiguration, является интерфейсом и не может быть создан - PullRequest
0 голосов
/ 22 февраля 2019

System.InvalidOperationException: текущий тип, Microsoft.Extensions.Configuration.IConfiguration, является интерфейсом и не может быть создан.Вам не хватает сопоставления типов?

Я использую Unity с .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 .

Что я делаю не так?Как я могу решить это?

1 Ответ

0 голосов
/ 22 февраля 2019

Предполагая, что файл похож на 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; }
}

и заполнить его экземпляр из конфигурации * 1021.*

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;
    //...
}

Ссылка Конфигурация в ASP.NET Core

...