我想知道这是否可行。我有一个典型的MVC动作方法,其签名如下所示:
public ActionResult View(MyModel model)
{
IAnObject myObject = new AnObject();
//several lines of code follow.....
return View(model);
}
我想摆脱那个new
关键字并将一个IAnObject实例注入到action方法中。但是我不确定MVC是否允许这样做,在动作方法中沿着模型注入一个类?有没有人碰到这个,有没有办法解决它? (我们的IoC容器是Windsor,以防万一。)
答案 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。