Как создать синглтон при запуске сервиса grp c? - PullRequest
0 голосов
/ 02 мая 2020

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

Моя идея - сервер gRP C (. NET Core 3.1), который создает сервис в начале программы и перенаправляет сервис на контроллер gRP C, используя контейнер Io C по умолчанию. Моя служба также должна иметь возможность использовать другие службы, используя значение по умолчанию IServiceProvider (например, для ведения журнала).

Мой первый подход заключался в создании службы в ConfigureServices и передаче экземпляра в AddSingleton. Это не сработало, потому что моему сервису нужны IServiceProvider, которые еще не были встроены в ConfigureServices.

Затем я обнаружил, что вы можете указать фабрику, которая принимает поставщика услуг в качестве аргумента:

services.AddSingleton<IService>(serviceProvider => new Service(serviceProvider));

Теперь мой сервис получает доступ ко всем остальным сервисам, но он создается только после того, как клиент gRP C запрашивает информацию об услуге.

Есть ли способ мгновенно создать службу?

Заранее спасибо.

1 Ответ

1 голос
/ 02 мая 2020

Вы можете создать экземпляр ServiceProvider в любое время внутри ConfigureServices, используя services.BuildServiceProvider(), и передать его своему Service синглтону. Однако обратите внимание, что все услуги, зарегистрированные в IServiceCollection после , который вы создаете ServiceProvider, не будут доступны через провайдера. Например:

public void ConfigureServices(IServiceCollection services)
{
    var sp = services.BuildServiceProvider();
    var service = new Service(sp);
    services.AddSingleton(service);

    // ...

    services.AddScoped<IOtherService, OtherServiceImplementation>();
    var otherService = sp.GetService<IOtherService>();
    // otherService == null
}

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

...