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

时间:2017-04-19 10:49:07

标签: c# dependency-injection asp.net-core .net-core

就在最近,我一直在试用新的asp.net功能并遇到了这个问题。 我知道我们可以将配置读作强类型实例。但我不知道如何在Microsoft依赖注入中将配置注入我的类。

git submodule

配置类:

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
    }
}

然后在我声明的startup.cs中,需要传递MyConfiguration。但我找不到办法这样做。请指教!

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

2 个答案:

答案 0 :(得分:4)

选项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

您可以按原样保留代码;直接在MyConfiguration方法中实例化ConfigureServices的实例并用于ypur Provider实例创建:

var myConfiguration = new MyConfiguration();
Configuration.GetSection("MyConfiguration").Bind(myConfiguration);

services.AddSingleton<IProvider>(new ProviderOne(myConfiguration));

主要区别在于,在这种情况下,您不要将DI容器用于ProviderOne实例化。因此主要的缺点是,如果您需要为提供程序添加更多依赖项(以及扩展构造函数参数的数量),您还应该在ConfigureServices方法中解决这些依赖项。有关详细信息,您可能会发现下一个讨论很有用:Best way to resolve during ConfigureServices

一般情况下,对于IMyConfiguration只有一个实现的情况,可以这样做:

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

和DI容器将了解如何处理它。但由于内置的​​DI容器不允许注册多个服务然后检索特定的服务,因此这不适合您。有些人使用Factory模式解决了这个问题。您将在下一个SO问题中找到更多信息:How to register multiple implementations of the same interface in Asp.Net Core?

答案 1 :(得分:0)

  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;