Шаблон параметров - Интерфейс / Абстрактное свойство
Я хочу связать следующий объект с данными 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();
}