Вот фон:
У меня есть незавершенное приложение, которое подключается к нескольким каналам из разных внутренних систем по разным протоколам (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 Ядро. Я уверен, что упускаю что-то простое!
Заранее спасибо всем, кто сможет предложить мне любую идею!