Добавление нескольких маршрутов конечной точки в приложение основной консоли. net из настроек приложения. json - PullRequest
1 голос
/ 21 апреля 2020

Я использую. net core 3.1 для создания консольного приложения, которое действует как API-обработчик событий.

Приложение фиксирует изменения в базе данных и направляет эти изменения в другие API в реальном времени. время. Обновления «customer» go до «customerAPI», «product» переходят в «productAPI» и так далее. Это означает, что у меня есть appsettings.Local. json, который выглядит следующим образом:

 "DBConnectionStrings": {
    "DefaultConnection": "AccountEndpoint=(my account)",
    "SourceDatabaseName": "MyDB",
    "SourceContainerName": "MySource",
    "LeasesContainerName": "MyLease",
    "PartitionKey": "/id"
  },
  "EndpointAPIStrings": {
    "Endpoint1": {
      "EndpointUrl": "https://localhost:7777",
      "Username": "myusername1",
      "Password": "mypassword1",
    "Endpoint2": {
      "EndpointUrl": "https://localhost:8888",
      "Username": "myusername2",
      "Password": "mypassword2",
    "Endpoint3": {
      "EndpointUrl": "https://localhost:9999",
      "Username": "myusername3",
      "Password": "mypassword3"
    ...
    }

В настоящее время я использую дрянной метод объявления их как EnvironmentVariables, чтобы получить их из моего Main, где создается конфигурация на мою задачу CallAPI.

Main:

public static async Task Main(string[] args)
{
    ...
    IConfiguration configuration = BuildConfiguration(environmentName);
    CosmosClient cosmosClient = BuildCosmosClient(configuration);

    Environment.SetEnvironmentVariable("EndpointUrl", configuration["EndpointAPIStrings:Endpoint1:EndpointURL"]);
    Environment.SetEnvironmentVariable("Username", configuration["EndpointAPIStrings:Endpoint1:Username"]);
    Environment.SetEnvironmentVariable("Password", configuration["EndpointAPIStrings:Endpoint1:Password"]);
    ...
}

Функция делегата:

...
if (entityType == "myproduct")
{
    var entity = "products";
    var result = await Task.Run(() => CallAPIAsync(entity, item));
}
...

Задача CallAPI:

public static async Task<HttpResponseMessage> CallAPIAsync(string entity, ProcessedItem item)
{
    using (var client = new HttpClient())
    {
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        var endpointUrl = Environment.GetEnvironmentVariable("EndpointUrl");
        var uri = new Uri($"{endpointUrl}/api/{entity}/{item.Id}/propagate");
        string username = Environment.GetEnvironmentVariable("Username");
        string password = Environment.GetEnvironmentVariable("Password");
        ...
    }
}

Это, очевидно, работает для первой конечной точки и игнорирует другие.

Как я могу реорганизовать это, чтобы получить значения в моей Задаче CallAPI для всех EndpointAPIStrings?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Я сделал это в Windows Сервисе. net Приложение Core 3.1, очень похоже. По сути, когда вы вызываете свою функцию IHostBuilder в program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog())
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });

Вы получаете доступ к переменным конфигурации из настроек приложения. json по умолчанию. К которым затем можно получить доступ в вашем главном запуске или выполнить функцию:

private readonly ILogger<Worker> _logger;

private readonly IServiceScopeFactory _serviceScopeFactory;

private readonly IConfiguration _config;

public Worker(ILogger<Worker> logger, IServiceScopeFactory serviceScopeFactory, IConfiguration config)
            {
                _logger = logger;
                _serviceScopeFactory = serviceScopeFactory;
                _config = config;
            }  

А затем в вашей основной или выполнить функцию:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // Must be a scoped process in order to run correctly
            using var scope = _serviceScopeFactory.CreateScope();
            // Start timer and begin log
            var startTime = DateTime.UtcNow;
            var env = _config.GetValue<string>("ENV");
            var stageTable = _config.GetValue<string>("StageTable");
            var prevTable = _config.GetValue<string>("PrevTable");
            var mainTable = _config.GetValue<string>("MainTable");
            var sqlConnectionString = _config.GetValue<string>("SqlConnString_" + env);
            var excelConnectionString = _config.GetValue<string>("ExcelConnectionString1") +
                                        _config.GetValue<string>("ExcelFilePath_" + env) +
                                        _config.GetValue<string>("ExcelFileName") +
                                        _config.GetValue<string>("ExcelConnectionString2");

с настройками приложения. json как:

"ENV": "LOCAL",
"StageTable": "Staging",
"PrevTable": "Previous",
"MainTable": "Courses",
0 голосов
/ 21 апреля 2020

Вы можете создать класс для него и прочитать значения в этот класс. Также было бы неплохо изменить его на список в JSON. Шаги, которые я бы сделал:

  1. Измените 'EndpointAPIStrings' на массив:

    {
      "EndpointAPIStrings":[
        {
           "Id":"Endpoint1",
           "EndpointUrl":"https://localhost:7777",
           "Username":"myusername1",
           "Password":"mypassword1"
        },
        {
           "Id":"Endpoint2",
           "EndpointUrl":"https://localhost:8888",
           "Username":"myusername2",
           "Password":"mypassword2"
        },
        {
           "Id":"Endpoint3",
           "EndpointUrl":"https://localhost:9999",
           "Username":"myusername3",
           "Password":"mypassword3"
        }
      ]
    }
    
  2. Создайте класс C#, определяющий объекты в JSON массив:

    public sealed class EndPoint {
        public string Id { get; set; }
    
        public string EndPointUrl { get; set; }
    
        public string Username { get; set; }
    
        public string Password { get; set; }
    }
    
  3. Измените извлечение данных из конфигурации:

    IConfiguration configuration = BuildConfiguration(environmentName);
    CosmosClient cosmosClient = BuildCosmosClient(configuration);
    
    List<EndPoint> endPoints = configuration.GetSection("EndPointAPIStrings").Get<List<EndPoint>>();
    

Теперь у вас есть все ваши конечные точки в переменной endPoints. Вы можете удалять и добавлять свойства в JSON так, как вам нравится, и единственное, что вам нужно сделать, это соответственно изменить класс. Обратите внимание, , что вам нужны одинаковые имена в JSON и в C# классе, чтобы получить успешное отображение.

...