0

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

示例:我有 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 设置,然后将该配置应用于每个部署的应用程序。

在应用程序配置中,鼓励我使用“应用程序:设置:子设置”,所以看起来我会

在代码中

....
          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.

我更喜欢这个,但我的目标是为了麻烦吗?

4

1 回答 1

1

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

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

钥匙 价值
默认值: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来删除这些前缀。有了这个,我的应用程序的其余部分就不需要担心前缀了,每个配置设置只有一个值。

于 2021-08-04T03:39:01.393 回答