Как передать общий объект между Worker Service и WebService с помощью Dependency Injection - PullRequest
1 голос
/ 19 марта 2020

Я написал. net core 3 workerservice, в котором также есть webapi, встроенный в тот же проект - цель состоит в том, чтобы позволить размещенному работнику serviceservice представить webapi healthcheck, который можно запрашивать для предоставления информации о состоянии службы работника. Мы используем общий шаблон для добавления вызовов проверок работоспособности ко всем нашим микросервисам webapi.

Работающий сервис и webapi прекрасно работают сами по себе, но я не могу понять, как внедрить общий объект в две службы, которые будут использоваться для передачи данные назад и вперед между двумя.

Я предполагаю, что мне нужно создать объект статуса в методе CreateHostBuilder класса Program и вставить его в оба, но не могу найти подходящих методов для его передачи.

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            // HealthCheck WebAPI
            .ConfigureWebHostDefaults(webBuilder =>
                                        {
                                            webBuilder.UseKestrel();
                                            webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
                                            webBuilder.UseIISIntegration();
                                            webBuilder.UseStartup<Startup>();
                                        })
            .ConfigureHostConfiguration(configHost =>
                                        {
                                            configHost.SetBasePath(Directory.GetCurrentDirectory());
                                            configHost.AddJsonFile("hosting.json", optional: false);
                                        })
            // WorkerService
            .ConfigureAppConfiguration((hostContext, config) =>
                                        {
                                            config
                                                .SetBasePath(Environment.CurrentDirectory)
                                                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                                                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName.ToLower()}.json", optional: false);

                                            config.AddEnvironmentVariables();
                                        })
            .ConfigureServices((hostContext, services) =>
                                {
                                    services.AddOptions();
                                    services.AddHostedService<Worker>();
                                });

Объект состояния может быть чем-то вроде ...

    public class StatusInfo
    {
        public DateTime LastRun { get; set; }
        public int LastAdded { get; set; }
        public int LastUpdated { get; set; }
    }

Кто-нибудь может мне помочь, пожалуйста?

1 Ответ

1 голос
/ 20 марта 2020

Просто создайте сервис, который знает, как сохранить и получить общие данные.

Слишком упрощенная абстракция

public interface IStatusService {
    Task Save(StatusInfo status);
    Task<StatusInfo> Get();
}

Внедрить эту службу в работника для сохранения данных и внедрить его в контроллер для извлечения данных.

...