选项模式-接口/抽象属性

时间:2019-12-01 09:21:08

标签: c# .net-core .net-core-configuration servicecollection

我想将以下对象与 ServiceCollection 中的 appsettings.json 数据绑定,但是我无法更改类或接口的设计:

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 个答案:

答案 0 :(得分:1)

由于界面和所陈述的限制,您将需要自己建立选项成员

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();

答案 1 :(得分:0)

  

不能直接实例化接口。

因此,如果您不能更改类的设计-也就是说,使用ConnectionInfo的具体实现-我想您可以实例化ConnectionInfo类并将其分配给IConnectionInfo接口,如下所示:

public class TransferOptions : ITransferOptions 
{
   public IConnectionInfo Source { get; set; } = new ConnectionInfo();
   public IConnectionInfo Destination { get; set; } = new ConnectionInfo();
}