最近,我一直在尝试新的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中注册相同接口的多个实现?
- 创建一个具有必须从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; }
}
在startup.cs
中注入依赖项services.Configure<DecoderClientOptions> (Configuration.GetSection(nameof(DecoderClientOptions)));
使用其他类中的属性
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;