2009-07-29 11 views
1

Dans ASP.net MVC, l'injection de dépendances avec des contrôleurs est simple et directe. Maintenant, je voudrais enlever la plupart de la logique des vues en utilisant des aides. Le problème est que ces assistants utilisent certains des objets qui sont injectés.Aide et injection de dépendance ASP.NET MVC

Permettez-moi d'écrire un exemple:

public interface ISessionData 
{ 
    List<string> IdList {get;} 
} 

public MyController : Controller 
{ 

    public MyController(ISessionData sessionData) 
    { 
    ... 
    } 
} 
données de session

est injectée dans le contrôleur. Jusqu'ici tout va bien. Mais maintenant j'ai un assistant. Disons qu'il ressemble à ceci:

public class MyHelper 
    { 
     private readonly ISessionData sessionData; 

     public MyHelper(ISessionData sessionData) 
     { 
      this.sessionData = sessionData; 
     } 

     public bool CheckSomethingExistsInSession(string id) 
     { 
      return sessionData.IdList.Any(x => x.Id.Equals(id)); 
     } 
} 

Maintenant, quoi? Je voudrais que MyHelper soit injecté dans la vue. La seule chose que je peux voir est d'ajouter cette aide pour modéliser et passer à voir à chaque fois. D'autres idées?

Répondre

3

Dans MVC, il est préférable de transmettre des données ISessionData du contrôleur pour afficher (en utilisant ViewModel ou ViewData):

ViewData["Session"] = sessionData.IdList.ToList(); 

et enlever la dépendance ISessionData de l'aide. Quelque chose comme ceci:

public class MyHelper 
{ 
    //private readonly ISessionData sessionData; 

    public MyHelper(/*ISessionData sessionData*/) 
    { 
     //this.sessionData = sessionData; 
    } 

    public bool CheckSomethingExistsInSession(string id, IList<...> sessionData) 
    { 
     return sessionData.Any(x => x.Id.Equals(id)); 
    } 
} 

En Vue:

<% var somethingExists = new MyHelper().CheckSomethingExistsInSession(
    1, ViewData["Session"] as IList<...>); %> 

MISE À JOUR:

public static class MyHelper 
{ 
    public static bool CheckSomethingExistsInSession(string id, IList<...> sessionData) 
    { 
     return sessionData.Any(x => x.Id.Equals(id)); 
    } 
} 

<% var somethingExists = MyHelper.CheckSomethingExistsInSession(
    1, ViewData["Session"] as IList<...>); %> 
0

Vous devez supprimer la logique de session du constructeur de votre contrôleur et l'insérer dans la méthode d'action des contrôleurs par en utilisant un IModelBinder. Voir ci-dessous:

public class SessionDataModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     // Get/create session data implementating ISeesionData or whatever here. This will be return to the controller action method. 
     return new SessionData() 
    } 
} 

Sur contrôleur, vous vous feriez quelque chose comme:

public MyController : Controller   
{   

    public MyController() 
    {    
     .... 
    } 

    public ActionResult Index(ISessionData sessionData) 
    { 
     // do stuff with ISessionData. 

     // Redirect or whatever. 
     return this.RedirectToAction("Index"); 
    } 
} 

Vous devez ajouter votre IModelBinder comme ci-dessous pour être appelé. Vous pouvez le faire au démarrage de l'application http.

System.Web.Mvc.ModelBinders.Binders[typeof(ISessionData)] = new SessionDataModelBinder(); 
Questions connexes