Was sind auf IServiceProvider die Unterschiede zwischen den Methoden GetRequiredService und GetService?

72

Was sind die Unterschiede zwischen IServiceProvider.GetRequiredService()und IServiceProvider.GetService()?

Wann ist es eine bessere Idee zu verwenden GetRequiredService()?

Kunstbasis
quelle

Antworten:

96

Sie sollten diese Methoden selten aufrufen müssen, da Sie nach Möglichkeit die Konstruktorinjektion verwenden sollten.

In seltenen Fällen, z. B. in Fabriken oder zur dynamischen Instanziierung von Befehlshandlern, können Sie diese selbst beheben.

Davon abgesehen sollten Sie dort verwenden, GetRequiredServicewo Sie den Service benötigen . Es wird eine Ausnahme ausgelöst, wenn der Dienst nicht registriert ist.

GetServiceAuf der anderen Seite handelt es sich um optionale Abhängigkeiten, die nur zurückgegeben werden, nullwenn kein solcher Dienst registriert ist.

Tseng
quelle
2
Sie sollten beachten, dass sich diese Semantik bei Verwendung eines externen DI-Anbieters geringfügig ändern kann. Beispielsweise verhalten sich in StructureMap beide Funktionen unterschiedlich: github.com/structuremap/…
rekiem87
46

Der Unterschied besteht darin , dass die GetService<T>()Renditen , nullwenn sie den Dienst nicht finden kann. GetRequiredService<T>()wirft InvalidOperationExceptionstattdessen ein.

tchelidze
quelle