ASP.NET MVC依赖注入和帮助程序

时间:2009-07-29 10:42:00

标签: asp.net-mvc dependency-injection

在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注入视图中。我唯一能看到的方法就是将这个帮助器添加到模型中并每次都将其传递给视图。还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

在MVC中,最好将ISessionData数据从Controller传递给View(使用ViewModel或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));
    }
}

在视图中:

<% 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<...>); %>

答案 1 :(得分: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();