【问题标题】:How to use App Configuration for common resources如何使用 App Configuration 获取公共资源
【发布时间】:2021-08-04 11:39:01
【问题描述】:

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

在应用配置中,我被鼓励使用“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.

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

【问题讨论】:

    标签: azure-app-configuration


    【解决方案1】:

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

    【讨论】:

    • 哈!英雄所见略同 :-)。经过几天的实验,这正是我最终的结果。谢谢,我将标记为答案,以便其他人受益。干杯。
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 2011-07-11
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多