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>();
и вы можете перебирать их.