Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net 5.0中配置服务时如何使用配置数据?_C#_.net Core_Dependency Injection_Azure App Configuration - Fatal编程技术网

C# 在.Net 5.0中配置服务时如何使用配置数据?

C# 在.Net 5.0中配置服务时如何使用配置数据?,c#,.net-core,dependency-injection,azure-app-configuration,C#,.net Core,Dependency Injection,Azure App Configuration,我正在尝试使用已配置的自定义配置类来配置另一个服务。配置从本地设置和Azure AppConfiguration存储获取数据。这是我的启动代码: public void ConfigureServices(IServiceCollection services) { services.AddAzureAppConfiguration(); services.Configure<CustomConfig>(Configuration); services.Ad

我正在尝试使用已配置的自定义配置类来配置另一个服务。配置从本地设置和Azure AppConfiguration存储获取数据。这是我的启动代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAzureAppConfiguration();
    services.Configure<CustomConfig>(Configuration);

    services.AddTransient<ISomeService, SomeService>((serviceProvider) => 
        {
            CustomConfig config = serviceProvider.GetRequiredService<IOptions<CustomConfig>>().Value;
            return new SomeService(config);
        });
    //--------------------------------------------------------------------
    services.AddRazorPages();
    services.AddControllers();
}
public void配置服务(IServiceCollection服务)
{
services.AddAzureAppConfiguration();
服务。配置(配置);
services.AddTransient((serviceProvider)=>
{
CustomConfig config=serviceProvider.GetRequiredService().Value;
返回新服务(配置);
});
//--------------------------------------------------------------------
services.AddRazorPages();
services.AddControllers();
}
但是,在实例化SomeService时,我的自定义配置对象不包含应该来自Azure AppConfig的数据。它只有来自appsettings.json的数据。
这里出了什么问题,我能做些什么?

所以简单的回答是:它确实在工作。 我怀疑有什么愚蠢的错误,事实就是如此(有几行代码被注释了,所以没有从Azure中检索到数据——真是太遗憾了)

感谢@pinkfloydx33再次保证该模式应该有效

如果有人想知道如何绑定根配置值,它也可以工作。 在我的例子中,appsettings.json包含我需要连接到Azure AppConfig存储的根值(主要和次要端点、刷新间隔和密钥标签中使用的环境名称)以及与外部服务相对应的几个部分:数据库、AAD B2C等,这些都是从Azure AppConfig检索的。 因此,我的自定义类具有根值和一些嵌套类,如下所示:

public class CustomConfig : ConfigRoot
{
    // These root values come from appsettings.json or environment variables in Azure
    [IsRequired]
    public string Env { get; set; }

    [IsRequired, Regex("RegexAppConfigEndpoint")]
    public Uri AppConfigEndpointPrimary { get; set; }

    [IsRequired, Regex("RegexAppConfigEndpoint")]
    public Uri AppConfigEndpointSecondary { get; set; }

    public int AppConfigRefreshTimeoutMinutes { get; set; } = 30;

    // And these sections come from the Azure AppConfig(s) from the above
    public ConfigSectionDb Db { get; set; } = new ConfigSectionDb();

    public ConfigSectionB2c B2c { get; set; } = new ConfigSectionB2c();
    
    // Some other sections here...
}
这里ConfigSection类依次包含其他子类。所以我在这里有一个很好的层次结构。这里的ConfigRoot是一个提供验证方法的抽象类


它可以工作:这个
服务。配置(Configuration)部分从所有配置的提供程序获取所有数据-根和节。在我的例子中,它是两个Azure AppConfig,appsettings.json,环境变量。

我猜这是因为您绑定到配置的根,而不是相应的部分。您可能需要
服务.Configure(Configuration.GetSection(“CustomConfig”))
。例如,您的配置可能是
{“CustomConfig”:{“Prop1”:“value”}
CustomConfig:Prop1
的azure appconfig键。但您尚未显示配置值的示例,因此目前只能猜测(尽管可能性很大)不确定根和节之间的根本区别是什么?我的配置有一个层次结构:根值来自appsettings.json,多个结构化节值来自Azure AppConfig。当我在控制器/页面中使用配置值而不是在ConfigureServices()中使用配置值时,它可以正常工作。根值示例:“Env”“:“Dev”和AppConfig键:“Application:App:FrontDoorId”包含GUID。Configure从所有配置的提供程序获取数据,但在创建SomeService对象时,似乎只绑定localsettings。节名为Application:App,除非CustomConfig类(您尚未显示)具有一组嵌套属性(其中一个名为Application,而Application又有一个名为App的属性)然后绑定到根目录将不起作用,这就是为什么我知道您没有绑定到正确的东西。我使用应用程序设置、azure应用程序配置和各种其他源,并且我可以在您尝试的同一回调中成功地使用正确的值获取我的配置,但这只是因为如果您的类具有
publi,我将绑定到正确的部分c int A{get;set;}
但是您的json看起来像
{B:{A:1}
您必须绑定到名为“B”的节。类似地,如果您的AzureAppConfig有一个名为
X:Y:A=1
的值,那么您必须绑定到“X:Y”节