Dependency Injection & Model Binding (ASP MVC, Autofac), wann was einsetzen?
-
27-09-2019 - |
Frage
Das ist eher wie eine konzeptionelle Frage. Wann verwendet Modell Bindung (in ASP.NET MVC Framework) und, wenn Objekte mit IoC zu injizieren (sagen wir mal Autofac hier)?
Ein spezielles Szenario ist wie sagen wir mal, ich habe die folgende Aktion-Methode
public ActionResult EditProfile(string UserId)
{
// get user object from repository using the the UserId
// edit profile
// save changes
// return feedback
}
Im obigen Szenario ist es möglich, ein Benutzerobjekt zu Aktionsmethode zu injizieren, so dass sie automatisch das Benutzerobjekt erhalten den Benutzer-ID verwenden? Die sich ergebende Signatur Wesen:
public ActionResult EditProfile(UserProfile userObj) //userObj injected *somehow* to automatically retreive the object from repo using UserId ?
Sorry, wenn es nicht der Fall ist sinnvoll. It`s mein erstes Mal mit IoC.
EDIT:
Dies ist der Weg, um es> http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/
Lösung
Sie können tun, was Sie eine benutzerdefinierte Aktion Filter verwenden müssen. Durch das Überschreiben OnActionExecuting
, haben wir Zugriff auf die Routendaten und die Aktionsparameter der Aktion, die ausgeführt werden. Gegeben:
public class BindUserProfileAttribute : ActionFilterAttribute
{
public override OnActionExecuting(FilterContext filterContext)
{
string id = (string)filterContext.RouteData.Values["UserId"];
var model = new UserProfile { Id = id };
filtextContext.ActionParameters["userObj"] = model;
}
}
Dieses Attribut ermöglicht es uns, um die Parameter zu erstellen, die in die Aktion übergeben werden, so dass wir das Benutzerobjekt an dieser Stelle laden können.
[BindUserProfile]
public ActionResult EditProfile(UserProfile userObj)
{
}
Sie werden wahrscheinlich brauchen spezifische mit Ihren Routen zu bekommen:
routes.MapRoute(
"EditProfile",
"Account/EditProfile/{UserId}",
new { controller = "Account", action = "EditProfile" });
In MVC3 erhalten wir Zugriff auf die neue IDepedencyResolver-Schnittstelle, die uns IoC / SL verwenden Sie das IoC-Container oder Service Locator wollen wir ausführen können, so dass wir einen Service wie ein IUserProfileFactory
in Ihren Filter drücken kann, um dann in der Lage sein, erstellen Sie Ihre UserProfile
Instanz.
Ich hoffe, das hilft?
Andere Tipps
Modell Bindung für Ihre Daten verwendet. Dependency Injection für Ihre Geschäftslogik verwendet.