AddSingleton <> () против AddSingleton () - PullRequest
1 голос
/ 29 мая 2020

Я внедряю в свой проект внедрение зависимостей. Я нашел два способа добавить одноэлементную службу -

services.AddSingleton(new MyCustomService())

и

services.AddSingleton<MyCustomService>()

Оба метода работают. В чем разница между этими двумя методами и какой из них мне следует использовать?

Ответы [ 3 ]

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

Согласно docs в первом примере вы используете метод расширения AddSingleton<TService>(IServiceCollection, TService), а во втором - AddSingleton<TService>(IServiceCollection).

Разница между этими 2 - это время, когда создается экземпляр TService. Первый - вы создаете при регистрации. Во втором - при первом запросе он будет создан в виде контейнера.

Какой именно использовать, решать вам. Но если ваш MyCustomService может иметь дополнительные зависимости - думаю, AddSingleton<TService>(IServiceCollection) может быть более удобным.

0 голосов
/ 29 мая 2020

При использовании метода generi c .AddSingleton<TService>().AddSingleton<TService, TImplementation>() тип создается, контролируется и удаляется контейнером. Когда конструктор содержит другие зависимости, эти зависимости вводятся автоматически (метод, называемый «Автоматическое подключение»).

Экземпляры, предоставленные с использованием .AddSingleton<TService>(TService), уже существуют. В этом случае контейнер не будет избавляться от этого экземпляра, когда он реализует IDisposable или IAsyncDisposable . Вы сами несете ответственность за удаление этого экземпляра.

Поскольку .AddSingleton<TService>(TService) поставляется с уже существующим экземпляром, контейнер не может внедрить какие-либо зависимости, потому что для этого он также должен создать экземпляр.

0 голосов
/ 29 мая 2020

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

В первом случае вы добавляете SingletonService, который создаете самостоятельно. Во втором вы запрашиваете инъекцию зависимостей для загрузки MyCustomService на основе конфигурации. Последнее полезно, когда у вас могут быть разные версии MyCustomService для разных конфигураций приложения.

Другой взгляд на это. Первый - это загрузка синглтона и сбой, если это не так. Во втором случае используются дженерики для проверки типа сервиса, и он взорвется, если в конфигурации ничего не указано.

...