就在最近,我一直在试用新的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;}
}
答案 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)
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;