Шаблон параметров - Интерфейс / Абстрактное свойство

Я хочу связать следующий объект с данными appsettings.json в ServiceCollection, однако я не могу изменить дизайн класса или интерфейса:

public class TransferOptions :ITransferOptions 
{
   public IConnectionInfo Source {get;set;}
   public IConnectionInfo Destination {get;set;}
}

public class ConnectionInfo : IConnectionInfo
{
   public string UserName{get;set;}
   public string Password{get;set;}
}

public interface ITransferOptions
{
   IConnectionInfo Source {get;set;}
   IConnectionInfo Destination {get;set;}
}

public interface IConnectionInfo
{
   string UserName{get;set;}
   string Password{get;set;}
}

это мои данные в appsettings.json

{
"TransferOptions":{
    "Source ":{
                 "UserName":"USERNAME",
                 "Password":"PASSWORD"
              },
    "Destination":{
                 "UserName":"USERNAME",
                 "Password":"PASSWORD"
              }
   }
}

Вот моя конфигурация поставщика услуг:

var provider=new ServiceCollection()
.Configure<TransferOptions>(options => _configuration.GetSection("TransferOptions").Bind(options))
.BuildServiceProvider();

Это часть, я получаю ошибку

Невозможно создать экземпляр типа IConnectionInfo, потому что он является абстрактным или интерфейсом:

var transferOptions =_serviceProvider.GetService<IOptions<TransferOptions>>()

2 ответа

Решение

Из-за интерфейсов и заявленных ограничений вам нужно будет самостоятельно создать элементы опций.

var services = new ServiceCollection();

IConnectionInfo source = _configuration.GetSection("TransferOptions:Source").Get<ConnectionInfo>();
IConnectionInfo destination = _configuration.GetSection("TransferOptions:Destination").Get<ConnectionInfo>();

services.Configure<TransferOptions>(options => {
    options.Source = source;
    options.Destination = destination;
});

var provider = services.BuildServiceProvider();

Интерфейс не может быть создан напрямую.

Итак, если вы не можете изменить дизайн своего класса, то есть использовать конкретную реализацию ConnectionInfo, я предполагаю, что вы можете создать экземпляр класса ConnectionInfo и назначить его интерфейсу IConnectionInfo следующим образом:

public class TransferOptions : ITransferOptions 
{
   public IConnectionInfo Source { get; set; } = new ConnectionInfo();
   public IConnectionInfo Destination { get; set; } = new ConnectionInfo();
}
Другие вопросы по тегам