【问题标题】:Creating object from appsettings on method calling in MVC在 MVC 中调用方法时从 appsettings 创建对象
【发布时间】:2023-01-14 01:03:58
【问题描述】:

我正在开发一个连接到多个 CosmosDB 数据库以执行数据清理的 MVC。它根据调用查询方法的方法进行连接,因此 Cosmos 连接是在查询执行期间建立的。然后在查询执行完毕后将其丢弃。

我在这里实现了一个帮助程序服务,它应该返回一个 EndpointConfiguration 实例,我将使用它来连接和执行查询:

    public static class ConfigurationService
    {
        public static EndpointConfiguration GetByName(string configKeyName)
        {
            var environmentName = "Development";

            var config = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.{environmentName}.json")
                .Build();

            var section = config.GetSection("CosmosConnectionStrings");
            var endpointConfiguration = section.Get<EndpointConfiguration>();

            return endpointConfiguration;
        }
    }

模型:

    public class EndpointConfiguration
    {
        public string DatabaseUrl { get; set; }
        public string SourceDatabase { get; set; }
        public string SourceContainer { get; set; }
    }

问题是我的代码在创建对象时没有填充值:

public static async Task<List<EventDocument>> GetEventDocsWithQueryAsync(string queryString, [CallerMemberName] string memberName = "")
        {
            string databaseName = ResolveDatabaseFromCallingMethod(memberName); //returns string of "DatabaseCosmosDb1" or "DatabaseCosmosDb2"
            var settings = ConfigurationService.GetByName(databaseName); //always null

            CosmosClient client = new CosmosClient(settings.DatabaseUrl, new CosmosClientOptions()
            {
                ConnectionMode = ConnectionMode.Gateway,
                AllowBulkExecution = true
            });
            Container container = client.GetContainer(settings.SourceDatabase, settings.SourceContainer);
            List<EventDocument> results = new List<EventDocument>();

            using (FeedIterator<EventDocument> resultSetIterator = container.GetItemQueryIterator<EventDocument>(queryString))
            {
                while (resultSetIterator.HasMoreResults)
                {
                    FeedResponse<EventDocument> response = await resultSetIterator.ReadNextAsync();
                    results.AddRange(response);
                }
            }
    
            client.Dispose();
            return results;
        }

appsettings.Development.json:

"CosmosConnectionStrings": {
    "DatabaseCosmosDb1": {
      "DatabaseUrl": "AccountEndpoint=[endpoint]",
      "SourceDatabase": "DatabaseA",
      "SourceContainer": "EventsA"
    },
    "DatabaseCosmosDb2": {
      "DatabaseUrl": "AccountEndpoint=[endpoint]",
      "SourceDatabase": "DatabaseB",
      "SourceContainer": "EventsB"
    }
  }

如何解决此问题以在方法期间获取数据库连接变量?

【问题讨论】:

  • 为什么不为 CosmosConnectionStrings 使用一个简单的数组?

标签: c# asp.net-mvc azure-cosmosdb


【解决方案1】:

这段代码可以提取出来不用每次都运行

var environmentName = "Development";

var config = new ConfigurationBuilder()
    .AddJsonFile($"appsettings.{environmentName}.json")
    .Build();

然后你需要指定一个部分的键

  var endpointConfiguration  = config.GetValue<EndpointConfiguration>($"CosmosConnectionStrings:{configKeyName}");
  return endpointConfiguration;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多