gpt4 book ai didi

c# - 如何从 AppSettings 读取配置值并将配置注入(inject)接口(interface)实例

转载 作者:太空狗 更新时间:2023-10-30 01:00:48 24 4
gpt4 key购买 nike

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

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

然后在我声明的 startup.cs 中,需要传递 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抽象接口(interface)。当你使用

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

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

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

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

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

关于c# - 如何从 AppSettings 读取配置值并将配置注入(inject)接口(interface)实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43493560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com