[英]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.