2009-07-29 6 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에서 (뷰 모델 또는을 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)); 
    } 
} 

: 갱신

<% 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(); 
관련 문제