Разница в методах инжекции синглтона в .net core 2.1 - PullRequest
0 голосов
/ 25 октября 2018

В чем разница между этими методами инъекции?

services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());

services.AddSingleton<IMyClass, MyClass>();

1 Ответ

0 голосов
/ 25 октября 2018
services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());

Пытается зарегистрировать IMyClass, если он уже зарегистрирован, ничего не произойдет и предыдущая регистрация останется единственной.Это приводит к одной IMyClass регистрации.

services.AddSingleton<IMyClass, MyClass>();

Зарегистрирует IMyClass в любом случае, даже если уже есть другая регистрация, например <IMyClass, DefaultMyClass>.Это приводит к двум IMyClass регистрациям.

Разница возникает при использовании provider.GetService / provider.GetRequriedService или при инъекции IMyClass против IEnumerable<IMyClass>.

При использовании provider.GetService / provider.GetRequriedService или при инъекции IMyClass,будет использоваться последняя регистрация (исправьте меня, если ошиблись, не можете найти ссылку / вопрос GitHub на панели быстрого доступа).

Так что если у вас есть

 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.AddSingleton<IMyClass, MyClass>();

MyClass, экземпляр будетбыть возвращенным после разрешения.

Принимая во внимание, что

 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.TryAdd(ServiceDescriptor.Singleton<IMyClass, MyClass>());

вернет DefaultMyClass, поскольку <IMyClass,MyClass> не будет зарегистрировано.

С другой стороны, когда вы используете provider.GetServices(...) (обратите внимание на версию множественного числа с s в конце) или введите IEnumerable<IMyClass>, тогда вы будете возвращать оба экземпляра при использовании

 services.AddSingleton<IMyClass, DefaultMyClass>();
 services.AddSingleton<IMyClass, MyClass>();

и вы можете перебирать их.

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