Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC Autofac ExtensionActionInvoker使用接口参数阻止我_Asp.net Mvc 3_Autofac_Model Binding_Actionmethod - Fatal编程技术网

Asp.net mvc 3 MVC Autofac ExtensionActionInvoker使用接口参数阻止我

Asp.net mvc 3 MVC Autofac ExtensionActionInvoker使用接口参数阻止我,asp.net-mvc-3,autofac,model-binding,actionmethod,Asp.net Mvc 3,Autofac,Model Binding,Actionmethod,在使用参数接口时,Autofac ExtensionActionInvoker与MVC ModelBinder交互时出现问题。背景如下: 我正在构建一个MVC应用程序,我正在使用Autofac MVC3的ExtensionActionInvoker将我的服务作为参数注入到我的操作中,例如 public ActionResult Test( IMyService service) { //A new instance of service is created by

在使用参数接口时,Autofac ExtensionActionInvoker与MVC ModelBinder交互时出现问题。背景如下:

我正在构建一个MVC应用程序,我正在使用Autofac MVC3的ExtensionActionInvoker将我的服务作为参数注入到我的操作中,例如

    public ActionResult Test( IMyService service)
    {
        //A new instance of service is created by Autofac ExtensibleActionInvoker 
        return View();
    }
这非常有效,并使设计变得非常干净。有关此方法的更多信息,请参阅。我希望在生成代码生成器以创建操作、视图、服务和DTO时使用此方法,而每操作服务方法使此过程变得更简单

但是,我还希望为action classed中的参数使用接口,这些参数接收来自HttpPost操作的输入。这是因为我使用DI在每个层之外创建类。如果我将DefaultModelBinder更改为使用DI创建类,请参阅Steve Sanderson关于MVC3的书中的第595页,了解如何做到这一点

    [HttpPost]
    public ActionResult Test(ITestClass dataComingFromView)
    {
        //model binder creates the class via DI and then binds it to the data from the post
        return View();
    }
然而,在上面的简单示例中,我得到了与启用ExtensionActionInvoker的冲突,即

如果未启用ExtensionInvoker,则上述方法可以正常工作,即扩展 DefaultModelBinder使用DI创建TestClass类和modelbinder绑定 从视图到类中字段的输入。 在启用ExtensionActionInvoker的情况下,它不起作用,也就是说,我得到一个没有绑定的空TestClass类。我假设ExtensionActionInvoker优先于模型绑定器,只创建一个空的TestClass类。 为了完整起见,我应该说,如果我只是开箱即用MVC,即没有新的DefaultModelBinder,也没有启用ExtensionActionInvoker,那么它表示您不能将接口用作操作方法参数。 对于任何比我更了解Autofac的人,我的问题是:我是否可以更改Autofac ExtensionalActionInvoker以选择它绑定到什么?我所有的注入服务都是从iSeries开始分类的,这样我就可以对它进行过滤。我知道你可以在其他地方的Autofac中做到这一点,但看不到任何可以用ExtensionActionInvoker做到这一点的东西,但也许我错过了

任何帮助都将不胜感激


Jon Smith-Selective Analytics

您认为问题是由ExtensionActionInvoker类引起的,这是正确的。如果您查看,有一个名为GetParameterValue的方法。见下文:

    protected override object GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)
    {
        if (_injectActionMethodParameters)
            return _context.ResolveOptional(parameterDescriptor.ParameterType) ?? base.GetParameterValue(controllerContext, parameterDescriptor);

        return base.GetParameterValue(controllerContext, parameterDescriptor);
    } 
此方法覆盖最终使用MVC框架的模型绑定器基础结构的方法。这意味着ActionInvoker首先尝试使用AutoFac解析参数,如果失败,则返回默认功能。根据您得到的结果,似乎必须设置AutoFac配置以提供ITestClass的默认分辨率

为了向AutoFac注册自定义ModelBinder,您有两个选项。您可以使用装饰视图模型,也可以在配置中使用中的自定义扩展方法装饰视图模型


我发现的一篇文章看起来像是提供了看结尾的功能,但我还没有亲自测试过

在研究这个问题之后,我找到了一个简单的答案。我的问题是因为我没有真正理解MVC模型绑定是如何工作的

如果你看一下我的原始问题,我已经创建了一个DefaultModelBinder,允许我使用接口作为我的模型参数,见顶部的原始问题。这是在我之后添加的,包括Autofac的ExtensionActionInvoker来绑定我的iSeries设备类型。问题是这两种DI方法相互冲突

答案是DefaultModelBinder足以绑定我的数据类和服务定义,因此我不需要Autofac的ExtensionActionInvoker。为了完整起见,我已经包含了DefaultModelBinder代码,以防它对其他人有用

public class DiModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        return modelType.IsInterface
                   ? DependencyResolver.Current.GetService(modelType)
                   : base.CreateModel(controllerContext, bindingContext, modelType);
    }
}

注意,我只在modeltype是接口时调用DependencyResolver,因为我不在层之间传递抽象类。任何替代方法都是始终调用DependencyResolver,然后在DI未解析该类型时调用base.CreateModel。我没有这样做,因为调用DependencyResolver有点贵,所以我只在知道需要时才调用它。

谢谢@smartcaveman。这是一个非常清楚的解释为什么它会发生,并链接到一些解决方案-完美。看过Autofac是如何实现这一点的之后,我想我会编写自己的GetValueProvider,但会有一个关于我替换哪些参数的过滤器。我会试试看,然后回来汇报。