3

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

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

我想摆脱该new关键字并将 IAnObject 的实例注入到操作方法中。但我不确定 MVC 是否允许这样做,在动作方法中将一个类与模型一起注入?有没有人遇到过这个问题,有没有办法解决它?(我们的 IoC 容器是 Windsor,以防万一。)

4

3 回答 3

1

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

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

        base.OnActionExecuting(filterContext);
    }
于 2013-02-20T05:54:13.797 回答
1

如果您希望将此引用作为参数注入到操作方法中,您可以查看 ControllerActionInvoker,它有一个 InvokeActionMethod 方法,我相信它是从 InvokeAction 调用的。这个方法有一个传递给它的参数列表,以及一个动作描述(ActionDescriptor 类)。此操作描述符有一个 GetParameters 方法,该方法将为您提供有关参数的更多详细信息,例如依赖注入器所需的类型信息。我没有这样做,所以我不太清楚它是如何工作的,但它似乎是可能的。

我也不知道这会如何影响 MVC 如何选择要发布到的操作方法,所以将其考虑在内。

于 2012-12-31T17:42:40.473 回答
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在容器中创建实例和具体类型,并将控制器与依赖项/引用解耦。

我真的考虑使用构造函数/属性注入。还有一个方法注入

于 2012-12-31T16:38:19.210 回答