2010-11-21 12 views
1

Dies ist eher eine konzeptionelle Frage. Wann sollte Model Binding (in ASP.NET MVC Framework) verwendet werden und wann Objekte mit IoC injiziert werden sollen (sagen wir Autofac hier)?Dependency Injection & Model Bindung (ASP MVC, Autofac), wann was zu verwenden?

Ein spezielles Szenario wie ist können sagen, 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 wird mit die Benutzerkennung? Die resultierende Signatur lautet:

public ActionResult EditProfile(UserProfile userObj) //userObj injected *somehow* to automatically retreive the object from repo using UserId ? 

Sorry, wenn es alles keinen Sinn ergibt. Es ist das erste Mal, dass ich IoC nutze.

EDIT:

Dies ist der Weg, es zu tun>http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/

Antwort

1

Sie können mit einem benutzerdefinierten Aktionsfilter tun, was Sie brauchen. Durch das Überschreiben von OnActionExecuting haben wir Zugriff auf die Routendaten und die Aktionsparameter der Aktion, die ausgeführt wird. 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 an dieser Stelle das Benutzerobjekt laden.

[BindUserProfile] 
public ActionResult EditProfile(UserProfile userObj) 
{ 

} 

Sie müssen wahrscheinlich mit Ihren Routen spezifisch bekommen:

routes.MapRoute(
    "EditProfile", 
    "Account/EditProfile/{UserId}", 
    new { controller = "Account", action = "EditProfile" }); 

In MVC3 wir Zugriff auf die neue IDepedencyResolver Schnittstelle erhalten, die uns IoC/SL verwenden Sie das IoC-Container durchführen können oder Service Locator wir wollen, so können wir einen Service wie eine IUserProfileFactory in Ihren Filter schieben, um dann in der Lage sein, Ihre UserProfile Instanz zu erstellen.

Hoffe, dass hilft?

+0

Ja Matthew, das macht wirklich Sinn, aber ich habe eine noch bessere Lösung in dem folgenden Link gefunden. Wir können unseren eigenen Model Binder implementieren und das Benutzerobjekt aus Repo darin holen. Ich finde es viel konsistenter zum Model Binding Konzept. > http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/. – neebz

0

Modell verbindlich für Ihre Daten verwendet wird. Die Abhängigkeitsinjektion wird für Ihre Geschäftslogik verwendet.