Verwenden der Abhängigkeitsinjektion in ASP.NET MVC3 Model Binder

8

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

%Vor%

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()

zu sagen

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?

    
trailmax 01.06.2012, 10:24
quelle

3 Antworten

6

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.

    
Steven 01.06.2012, 13:02
quelle
4

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.

    
Paul Stovell 01.06.2012 14:16
quelle
1

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.

    
tallseth 01.06.2012 12:11
quelle