如何使用 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
以删除这些前缀。有了这个,我的应用程序的其余部分就不需要担心前缀,每个配置设置只有一个值。
这 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
以删除这些前缀。有了这个,我的应用程序的其余部分就不需要担心前缀,每个配置设置只有一个值。