2010-11-21 5 views
1

Cela ressemble plus à une question conceptuelle. Quand utiliser Model Binding (dans ASP.NET MVC Framework) et quand injecter des objets en utilisant IoC (disons Autofac ici)?Injection de dépendances et liaison modèle (ASP MVC, Autofac), Quand utiliser quoi?

Un scénario spécifique est comme permet de dire, j'ai la méthode d'action suivante

public ActionResult EditProfile(string UserId) 
{ 
    // get user object from repository using the the UserId 
    // edit profile 
    // save changes 
    // return feedback 
} 

Dans le scénario ci-dessus, il est possible d'injecter un objet utilisateur à la méthode d'action telle qu'elle obtient automatiquement l'objet utilisateur à l'aide l'ID utilisateur? L'être de signature résultant:

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

Désolé si tout n'a pas de sens. C'est la première fois que j'utilise IoC.

EDIT:

Ceci est la façon de le faire>http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/

Répondre

1

Vous pouvez faire ce dont vous avez besoin en utilisant un filtre d'action personnalisé. En surchargeant OnActionExecuting, nous avons accès aux données de route et aux paramètres d'action de l'action qui sera exécutée. Étant donné:

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; 
    } 
} 

Cet attribut permet de créer les paramètres qui seront transmis dans l'action, afin que nous puissions charger l'objet utilisateur à ce point.

[BindUserProfile] 
public ActionResult EditProfile(UserProfile userObj) 
{ 

} 

Vous aurez probablement besoin d'obtenir précis avec vos itinéraires:

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

En MVC3 nous obtenons l'accès à la nouvelle interface IDepedencyResolver, ce qui nous permet d'effectuer IoC/SL en utilisant tout conteneur IoC ou service de localisation que nous voulons, afin que nous puissions pousser un service comme un IUserProfileFactory dans votre filtre, afin de pouvoir créer votre instance UserProfile.

Espérons que ça aide?

+0

Oui Matthieu a vraiment du sens, mais j'ai trouvé une solution encore meilleure dans le lien suivant. Nous pouvons implémenter notre propre Model Binder et y récupérer l'objet utilisateur. Je le trouve beaucoup plus cohérent avec le concept Model Binding. > http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/. – neebz

0

modèle de liaison est utilisé pour vos données. L'injection de dépendances est utilisée pour votre logique métier.

Questions connexes