2009-07-29 22 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をビューに注入したいと思います。私が見ることができる唯一の方法は、このヘルパーをモデルに追加し、毎回見るためにそれを渡すことです。他のアイデア?

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

とヘルパーからISessionDataの依存関係を削除します。

答えて

3

はMVCでは、(のViewModelまたはViewDataを使用して)表示するコントローラーから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)); 
    } 
} 

:UPDATED

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

をあなたはあなたのようなものだろう、コントローラ上:あなたはそれが呼ばれるようにするために、以下のようなあなたのIModelBinderを追加する必要が

public MyController : Controller   
{   

    public MyController() 
    {    
     .... 
    } 

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

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

を。 httpアプリケーションの起動時にこれを行うことができます。

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