如何使用 App Configuration 获取公共资源

How to use App Configuration for common resources

SO 很接近,但我的问题是关于如何在多个应用程序之间共享 Azure 应用程序配置中的配置。我知道这如何帮助配置应用程序本身(它是如何工作的),但正在寻找有关如何跨应用程序共享设置的建议。 Esp 因为应用程序配置服务中没有交叉引用。

示例:我有 3 个应用程序服务。他们都在另一个服务中调用相同的内部 REST api。

在应用程序配置中,我通常有一个 appSettings.json 或应用程序服务配置设置,例如:

"MyRestApi":{
  "Url":"https://myRestApi-Dev.com/api",
  "api1ControllerName" : "Home",
}

或更好(对操作人员来说比隐藏 appSettings.json 更明显):

MyRestApi__Url = "https://myRestApi-Dev.com/api"
MyRestApi__api1ControllerName = "Home"

所以每个应用都会有这个以及许多其他设置。在 Devops 中,我使用带有公共和每个环境组变量的管道库。我检测到 dev/test/prod 环境并覆盖 url 设置,然后将该配置应用于每个已部署的应用程序。

在 App Confirguration 中,我被鼓励使用“App:Setting:Subsetting”,所以看起来我会

在代码中

....
          options
                .Connect(settings.GetConnectionString("AppConfig"))
                // Load configuration values with no label
                .Select(KeyFilter.Any, LabelFilter.Null)
                // Override with any configuration values specific to current hosting env
                .Select(KeyFilter.Any, hostingContext.HostingEnvironment.EnvironmentName)

services.Configure<MyRestApiSettings>(Configuration.GetSection("App1:myRestApi")); //in app 1

services.Configure<MyRestApiSettings>(Configuration.GetSection("App2:myRestApi")); // in app 2

services.Configure<MyRestApiSettings>(Configuration.GetSection("App3:myRestApi")); // in app 3

在应用程序配置中

app1:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Dev)
app1:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Test)
app1:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Prod)    
app1:MyRestApi:api1ControllerName = "Home" (Label: null)


app2:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Dev)
app2:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Test)
app2:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Prod)
app2:MyRestApi:api1ControllerName = "Home" (Label: null)

app3:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Dev)
app3:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Test)
app3:MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Prod)
app3:MyRestApi:api1ControllerName = "Home" (Label: null)

似乎有很多打字错误。

那么是不是更好:

MyRestApi:Url = "https://myRestApi-Dev.com/api" (Label: Dev)
MyRestApi:Url = "https://myRestApi-Test.com/api" (Label: Test)
MyRestApi:Url = "https://myRestApi-Prod.com/api" (Label: Prod)
MyRestApi:api1ControllerName = "Home" (Label: null)

然后在应用程序中使用 IOptions 将“MyRestApi”加载到其余的设置对象中 API?

services.Configure<MyRestApiSettings>(Configuration.GetSection("myRestApi")); // in all apps.

我更喜欢这个,但我是想惹麻烦吗?

@MarkD,你的方法会奏效。我在这里添加一个替代解决方案。

您可以将共享配置放在单独的命名空间(前缀)中,例如

Key value
Default:MyRestApi:Url ...
App1:MyRestApi:Url ...
App2:MyRestApi:SomethingElse ...

然后您首先加载前缀为 Default 的所有内容,并使用任何特定于应用程序的设置覆盖它们,例如,这是我的 App1 代码:

configBuilder.AddAzureAppConfiguration(options => {
    options.Connect(configuration["connection_string"])
           .Select("Default:*")
           .Select("App1:*")
           .TrimKeyPrefix("Default:")
           .TrimKeyPrefix("App1:");
});

请注意,我调用了 TrimKeyPrefix 以删除这些前缀。有了这个,我的应用程序的其余部分就不需要担心前缀,每个配置设置只有一个值。