Ich arbeite an der MVC3-Website und versuche Ninject zu verwenden, um meine Abhängigkeiten aufzulösen. Ich habe folgendes Szenario:
%Vor%hat die kommentierten Codezeilen bemerkt?
Ich registriere den Binder in Global.asax
als
Also kann ich durch die Konstruktion keine Injektion machen.
UserDataService
hat eine Kette von Abhängigkeiten: UserDataService -> UserRepository -> Context
. Also wäre es gut Ninject hier zu benutzen.
Das Problem ist, wenn ich [Inject]
über userData
-Deklaration auskommentiere und versuche, Ninject zu bekommen, um ein Objekt als Parameter zu injizieren, funktioniert es aus irgendeinem Grund nicht: Ich bekomme Null-Referenz-Ausnahmen.
( könnte es sein, dass UserDataService
keine Schnittstelle hat und ich binde das Objekt an sich selbst: kernel.Bind<UserDataService>().ToSelf();
?? )
Ich habe eine andere kommentierte Zeile im Code:
%Vor% Wenn dies unkommentiert ist, funktioniert die Einrichtung, ich bekomme korrekte Objekte eingefügt, aber jetzt sind wir abhängig von DependencyResolver und das ist nicht viel besser als userDataService = new UserDataService()
Vermisse ich etwas? Gibt es eine andere Möglichkeit, ein Objekt als Parameter zu injizieren und keine Abhängigkeit von Ninject oder DependencyResolver einzuführen?
Ein Modellbinder sollte nur die Datenkonvertierung durchführen und sollte nicht von irgendwelchen Diensten abhängig sein und sicherlich keine Datenbankkommunikation auslösen. Dies sollte in einem anderen Teil Ihrer Anwendung erfolgen. Ihre Aktionsmethode sollte nur einen Guid userId
annehmen und Sie sollten userDataService.GetUser(UserID);
von Ihren Controllern aus aufrufen (oder in einer niedrigeren Ebene, zum Beispiel innerhalb eines Geschäftsbefehl ). Dadurch wird Ihr Problem nicht bestehen.
Sie könnten dies tun:
%Vor%Wenn Sie es anschließen:
%Vor% Der Vorteil ist, dass Ihr UserModelBinder
nicht weiß, dass ein Container verwendet wird, während er noch für die Injektion geöffnet ist.
Aber ich stimme Steven zu - mit einem Modellbinder scheint das nicht ganz richtig zu sein. Stattdessen können Sie ICurrentUserContext
in Ihre Controller injizieren, wobei die Implementierung den aktuellen Benutzer zurückgibt. Dann müssen Sie Ihren Controller-Aktionen nicht einmal einen Parameter hinzufügen.
Verwenden Sie DependencyResolver.Current
, um Ihren Service zu erhalten. Dies ist tatsächlich viel besser als die Verwendung von new
, da dies bedeutet, dass Sie diesen Service nicht an den Typ des Service gebunden haben. Sie können später entscheiden, UserDataService
zu einer Abstraktion zu machen und verschiedene Varianten anzuschließen, ohne den Client-Code zu ändern, was wirklich der springende Punkt ist.
Außerdem ist DependencyResolver.Current
ein einstellbares IDependencyResolver
, so dass Sie diese Schnittstelle selbst implementieren können, mit einer Klasse, die sie mit Ninject unterstützt, wenn Sie dieses Framework mögen.
Eine weitere Möglichkeit, die Abhängigkeitsinjektion in MVC3 durchzuführen, besteht darin, Ihre eigene IControllerActivator
einzurichten, die Ihnen erlaubt, stattdessen die Konstruktorinjektion durchzuführen.
Tags und Links asp.net-mvc .net c# dependency-injection ninject