2009-07-29 86 views
1

在asp.net MVC中,控制器的依賴注入非常簡單直接。現在,我想通過使用助手來刪除視圖中的大部分邏輯。問題是這些助手使用了一些注入的對象。ASP.NET MVC依賴注入和幫助器

讓我寫一個例子:

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

public MyController : Controller 
{ 

    public MyController(ISessionData sessionData) 
    { 
    ... 
    } 
} 

會話數據注入到控制器。到現在爲止還挺好。但現在我有一個幫手。假設它看起來像這樣:

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

現在是什麼?我想MyHelper被注入視圖。我唯一能看到的方式就是添加這個幫助器來建模並傳遞它以便每次查看。任何其他想法?

回答

3

在MVC最好是從控制器傳遞ISessionData數據視圖(使用視圖模型或ViewData的):

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

而從助手刪除ISessionData依賴。事情是這樣的:

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

在View:

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

更新:

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

你應該從你的控制器的構造函數刪除會話邏輯,並將其插入由控制器操作方法使用IModelBinder。請看下圖:

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

關於你的控制器,你會做這樣的事情:

public MyController : Controller   
{   

    public MyController() 
    {    
     .... 
    } 

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

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

您需要添加類似下面的IModelBinder它被調用。您可以在http應用程序的啓動中執行此操作。

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