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

4
我希望将以下对象与 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个回答

6

由于接口和规定的限制,您需要自己构建选项成员。

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

0

接口不能直接实例化。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接