簡體   English   中英

在 MVC 中調用方法時從 appsettings 創建 object

[英]Creating object from appsettings on method calling in MVC

我正在開發一個連接到多個 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;
        }
    }

Model:

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

問題是當我創建 object 時我的代碼沒有填充值:

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"
    }
  }

如何解決此問題以在方法期間獲取數據庫連接變量?

這段代碼可以提取出來不用每次都運行

var environmentName = "Development";

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

然后你需要指定一個部分的鍵

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

或者

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

  return endpointConfiguration;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM