Как я могу использовать шаблон Dependancy Injection для совместного использования сервиса между двумя экземплярами IHostBuilder в. Net Core? - PullRequest
0 голосов
/ 08 февраля 2020

Вот фон:

У меня есть незавершенное приложение, которое подключается к нескольким каналам из разных внутренних систем по разным протоколам (HTTP, SMB, NFS, MS * 1045). *), анализирует некоторые данные и затем создает объект Report для каждого канала. Приложение должно работать как Windows Служба.

Ленты будут периодически опрашиваться - разные расписания для разных лент - и изменения в них регистрируются.

Последний объект Report для данные FeedId будут затем получены через клиента gRP C по требованию. Я не буду автором системы, которая будет потреблять мои Report объекты, но gRP C кажется мне подходящим и радым для размещения.

До сих пор я написал класс Worker, который наследуется от BackgroundService и прекрасно выполняет заполнение объекта ConcurrentDictionary<Guid, Report>. Глядя в отладчик, я могу видеть все, как я ожидаю, обновляя с правильными интервалами и т. Д.

Я размещаю этот код Worker со следующим, который прекрасно работает как Windows Сервис:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

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

Вот где я застрял:

Следующим шагом является предоставление через gRP C такого метода, как GetLatestReport(FeedId). Мне удалось создать одно из следующих руководств, и я могу заставить его вернуть тестовое жестко запрограммированное представление Protobuf моего Report объекта просто отлично.

... , но Я не могу понять, как использовать шаблон внедрения зависимостей, чтобы позволить ссылаться на ConcurrentDictionary внутри моего метода gRP C. Как правильно делиться между моим BackgroundService кодом и моим хостингом экземпляров Kestrel gRP C?

Я уверен, что могу связать его с Singleton, у которого есть частный конструктор, но это, кажется, идти против зерна. NET Ядро. Я уверен, что упускаю что-то простое!

Заранее спасибо всем, кто сможет предложить мне любую идею!

1 Ответ

0 голосов
/ 26 февраля 2020

ConcurrentDictionary должен храниться не в приложении, а в хранилище вне приложения. чего-то типа redis будет достаточно. если затем вы хотите кэшировать его в приложении, вы можете использовать кэш-память.

Использование такого распределенного хранилища означает, что к данным также могут обращаться различные приложения.

...