依赖注入到MVC操作方法中

时间:2012-12-31 16:14:52

标签: asp.net-mvc dependency-injection controller actionmethod

我想知道这是否可行。我有一个典型的MVC动作方法,其签名如下所示:

public ActionResult View(MyModel model)
{
   IAnObject myObject = new AnObject();
   //several lines of code follow.....
   return View(model);
}

我想摆脱那个new关键字并将一个IAnObject实例注入到action方法中。但是我不确定MVC是否允许这样做,在动作方法中沿着模型注入一个类?有没有人碰到这个,有没有办法解决它? (我们的Io​​C容器是Windsor,以防万一。)

3 个答案:

答案 0 :(得分:1)

如果您希望将此引用作为参数注入action方法,则可以查看具有an InvokeActionMethod method的ControllerActionInvoker,我相信这是从InvokeAction调用的。此方法有一个传递给它的参数列表,以及操作的描述(ActionDescriptor class)。此操作描述符具有GetParameters方法,该方法将为您提供更多detailed information about the parameter,例如依赖项注入器所需的类型信息。我没有这样做,所以我不知道它是如何运作的,但似乎有可能。

我也不知道这可能会如何影响MVC如何选择要发布的动作方法,因此请将其归结为。

答案 1 :(得分:1)

您可能希望在执行控制器上的任何操作之前调用的OnActionExecuting中进行注入。这将为您提供诸如Request之类的上下文,但允许您设置成员变量 - 从而“模拟”构造函数注入。当然,你只需要为整个控制器做一次。

    [NonAction]
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _myService = .........;  // get from IoC container

        base.OnActionExecuting(filterContext);
    }

答案 2 :(得分:0)

嗯,我同意评论中的人,但是如果你想在方法范围中使用一个实例,试着从你的IoC容器中获取它,就像这样:

public ActionResult View(MyModel model)
{
   // take from the container of IoC
   IAnObject myObject = _continerIoC.Resolve<IAnObject >();

   //several lines of code follow.....
   return View(model);
}

避免使用new在容器中创建实例和具体类型,并将控制器与dependecies / references分离。

我真的考虑使用构造函数/属性注入。还有method injection