Simple Injector kann keine Abhängigkeiten in Web-API-Controller einfügen

Simple Injector kann keine Abhängigkeiten in Web-API-Controller einfügen

TLTR: das Problem wird durch die implizite Art und Weise verursacht, wie die Web-API Controller-Typen auflöst; Registrieren Sie Ihre Web-API-Controller explizit und Sie werden sehen, wo das Problem liegt.

Hier ist Schritt für Schritt, was unter der Decke passiert:

  1. Der System.Web.Http.DefaultHttpControllerActivator Anrufe in die SimpleInjectorWebApiDependencyResolver und fordert die Erstellung eines API-Controllers an.
  2. SimpleInjectorWebApiDependencyResolver leitet diesen Anruf an die SimpleInjector.Container weiter Beispiel.
  3. Das Container -Instanz hat jedoch keine expliziten Registrierungen für diesen API-Controller (da Sie dem Resolver einen leeren Container bereitgestellt haben).
  4. Da es keine explizite Registrierung gibt, versucht der Container, eine Last-Minute-Registrierung für diesen Typ durchzuführen.
  5. Dieser Controller-Typ hängt jedoch von Schnittstellen ab, die nicht aufgelöst werden können, weil sie nicht im Container registriert sind (denken Sie daran, dass Ihr Container leer ist).
  6. Obwohl der Container normalerweise eine Ausnahme auslösen würde, wird in diesem Fall null zurückgegeben, da der Typ über IServiceProvider.GetService angefordert wird Methode und der Typ wurde nicht explizit registriert.
  7. Der SimpleInjectorWebApiDependencyResolver ist GetService -Methode gibt null zurück auch, da es per Definition null zurückgeben sollte; Es sollte null zurückgeben, wenn keine Registrierung vorhanden ist (was derzeit der Fall ist).
  8. Seit DependencyResolver null zurückgegeben, DefaultHttpControllerActivator wird auf sein Standardverhalten zurückfallen, was bedeutet, dass dieser Typ selbst erstellt wird, aber dies erfordert, dass der Controller einen Standardkonstruktor hat.

Um es kurz zu machen, das Problem wird durch die implizite Art und Weise verursacht, wie die Web-API Controller-Typen auflöst.

Die Lösung hier lautet also:

  1. Haben Sie nur eine einzige Container in Ihrer Webanwendung. Dies verhindert alle möglichen Probleme und Komplikationen Ihrer Konfiguration.
  2. Registrieren Sie alle Web-API-Controller explizit im Container. Die explizite Registrierung von Controllern stellt sicher, dass Simple Injector eine Ausnahme auslöst, wenn ein Controller nicht aufgelöst werden kann. Außerdem können Sie damit container.Verify() anrufen wodurch die Anwendung beim Start fehlschlägt, wenn die Konfiguration ungültig ist (eine überprüfbare Konfiguration ist wichtig). Außerdem können Sie so die Konfiguration diagnostizieren, was Ihnen noch mehr Vertrauen in die Korrektheit Ihrer Konfiguration gibt.

Mein Rat ist, MVC und Web-API in einem eigenen Projekt zu platzieren. Das wird die Sache viel einfacher machen.

Die Registrierung aller Web-API-Controller kann mit dem folgenden Code erfolgen:

container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

AKTUALISIERUNG:

Da dieser Fehler so häufig vorkommt, werden neuere Versionen des SimpleInjectorWebApiDependencyResolver Klasse wird einfach nie gibt null zurück wenn ein Steuerungstyp angefordert wird. Stattdessen wird ein beschreibender Fehler ausgegeben. Aus diesem Grund sollten Sie nie mehr einen Fehler sehen, solange Sie den offiziellen SimpleInjectorWebApiDependencyResolver verwenden .