如何从AppSettings读取配置值并将配置注入接口实例



最近,我一直在尝试新的ASP.NET功能,并遇到了这个问题。我知道我们可以将配置读取为强键入实例。但是我不知道如何在Microsoft依赖注入中将配置注入我的类。

public interface IProvider
{
  IMyConfiguration Configuration {get;}
  Task Connect();
}
public abstract class Provider: IProvider
{
    private IMyConfiguration _myConfig;
    public Provider(IMyConfiguration config)
    {
        this._myConfig= config;
    }
    public IMyConfiguration Configuration => _myConfig;
    public abstract Task Connect();
}
public class ProviderOne:Provider
{
    public ProviderOne(IMyConfiguration  config) : base(config)
    {
    }
    public Task Connect()
    {
      //implementation
    }
}

配置类:

public interface IMyConfiguration
{
     string TerminalId { get;set; }
     bool IsDefault {get;set;}
}
public class MyConfiguration : IMyConfiguration
{
     string TerminalId { get;set; }
     bool IsDefault {get;set;}
}

,然后在我声明的启动中,需要通过myconfiguration。但是我找不到这样做的方法。请建议!

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<MyConfiguration>(Configuration.GetSection("MyConfiguration"));
  services.AddSingleton<IProvider>(new ProviderOne(//configuration)); //here is the problem
}

选项1

首先,您不需要IMyConfiguration接口。.NET Core已经使用自己的IOptions接口进行抽象。当您使用

services.Configure<MyConfiguration>(Configuration.GetSection("MyConfiguration"));

您告诉DI如何解决下一个依赖性:IOptions<MyConfiguration>

所以,而不是

public Provider(IMyConfiguration config)

使用

private MyConfiguration _myConfig;
public Provider(IOptions<MyConfiguration> options)
{
    this._myConfig = options.Value;
}

ProviderOne

相同
public ProviderOne(IOptions<MyConfiguration> options) : base(options)

作为.net core di知道如何解决注册的依赖项,现在您可以简单地使用该方法的下一个版本:

services.AddSingleton<IProvider, ProviderOne>();

选项2

您可以按原样留下代码;在ConfigureServices中直接实例化MyConfiguration的实例,用于YPUR提供商实例创建:

var myConfiguration = new MyConfiguration();
Configuration.GetSection("MyConfiguration").Bind(myConfiguration);
services.AddSingleton<IProvider>(new ProviderOne(myConfiguration));

主要区别在于,在这种情况下,您不会将DI容器用于ProviderOne实例化。因此,主要的缺点是,如果您需要为提供商添加更多依赖项(以及扩展构造函数参数(,则应在ConfigureServices方法中解决这些依赖项。有关更多详细信息,您可能会发现下一个讨论有用:在配置服务期间解决的最佳方法。

通常,对于您只有一个IMyConfiguration实现的情况,甚至可以这样做:

services.AddSingleton<IMyConfiguration>(myConfiguration);
services.AddSingleton<IProvider, ProviderOne>();

和di容器将了解如何处理。但是,由于内置DI容器不允许注册多个服务,然后检索特定的服务,因此这对您不起作用。有些人通过使用工厂模式来解决该问题。您将在下一个问题中找到更多问题:如何在ASP.NET Core中注册相同接口的多个实现?

  1. 创建一个具有必须从AppSettings读取的属性的类

appsettings.json

{
"DecoderClientOptions":
  {
     "url":"someurl@example.com",
     "key":"A90474-kGAAP1"
  }
}

1.创建模型类。

     public class DecoderClientOptions
        {
            public string url { get; set; }
            public int key { get; set; }
        }
  1. 在startup.cs

    中注入依赖项
         services.Configure<DecoderClientOptions> 
         (Configuration.GetSection(nameof(DecoderClientOptions)));
    
  2. 使用其他类中的属性

        public class DecoderClient : IDecoderClient
        {      
            private readonly IOptions<DecoderClientOptions> _ClientOptions;
            public DecoderClient(IOptions<DecoderClientOptions> ClientOptions)
            {
                _ClientOptions = ClientOptions;
            }
          var url = _ClientOptions.Value.url;
          var key = _ClientOptions.Value.key;
    

最新更新