Asp.net mvc 如何使用Autofac为MVC 3执行动作注入?

Asp.net mvc 如何使用Autofac为MVC 3执行动作注入?,asp.net-mvc,autofac,missingmethodexception,Asp.net Mvc,Autofac,Missingmethodexception,我正在创建一个ASP.NET MVC 3应用程序,试图利用如上所述的控制器动作注入 控制器构造函数注入工作没有任何问题,但我似乎无法让动作注入工作 我在Global.asax中设置了Autofac,如下所示: var builder=newcontainerbuilder(); 寄存器(c=>newtestinject{TestString=“hi”}); builder.RegisterType().As(); RegisterController(typeof(mvcapapplicatio

我正在创建一个ASP.NET MVC 3应用程序,试图利用如上所述的控制器动作注入

控制器构造函数注入工作没有任何问题,但我似乎无法让动作注入工作

我在Global.asax中设置了Autofac,如下所示:

var builder=newcontainerbuilder();
寄存器(c=>newtestinject{TestString=“hi”});
builder.RegisterType().As();
RegisterController(typeof(mvcapapplication.Assembly).InjectActionInvoker();
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
我的控制器有如下动作:

公共行动结果测试(ITestInject testInject)
{
返回视图(testInject);
}
TestInject/ITestInject类/接口定义为:

公共接口ITestInject
{
字符串测试字符串{get;}
}
公共类测试项目:ITestInject
{
公共字符串TestString{get;set;}
}
当我尝试导航到测试操作时,我看到以下错误:

“/”应用程序中出现服务器错误。

无法创建接口的实例

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:System.MissingMethodException:无法创建接口的实例

源错误:

在执行当前web请求期间生成了未经处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别

堆栈跟踪: [MissingMethodException: Cannot create an instance of an interface.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +199 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +572 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +449 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +317 Autofac.Integration.Mvc.ExtensibleActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +122 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343 System.Web.Mvc.Controller.ExecuteCore() +116 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10 System.Web.Mvc.
<
>c_DisplayClassb.
<
BeginProcessRequest>b
_5() +37 System.Web.Mvc.Async.
<
>c_DisplayClass1.
<
MakeVoidDelegate>b
_0() +21 System.Web.Mvc.Async.
<
>c_DisplayClass8`1.
<
BeginSynchronous>b
_7(IAsyncResult ) +12 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 System.Web.Mvc.
<
>c
_DisplayClasse.
<
EndProcessRequest>b_d() +50 System.Web.Mvc.SecurityUtil.
<
GetCallInAppTrustThunk>b
_0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8841105 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 [MissingMethodException:无法创建接口的实例。] System.RuntimeTypeHandle.CreateInstance(RuntimeType类型、Boolean publicOnly、Boolean noCheck、Boolean&canBeCached、RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)+0 System.RuntimeType.CreateInstanceSlow(布尔publicOnly、布尔skipCheckThis、布尔fillCache)+98 System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly、布尔skipVisibilityChecks、布尔skipCheckThis、布尔fillCache)+241 System.Activator.CreateInstance(类型,布尔非公共)+69 CreateModel(ControllerContext ControllerContext,ModelBindingContext bindingContext,Type modelType)+199 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+572 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)+449 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext ControllerContext,ParameterDescriptor ParameterDescriptor)+317 Autofac.Integration.Mvc.ExtensibleActionInvoker.GetParameterValue(ControllerContext ControllerContext,ParameterDescriptor ParameterDescriptor)+122 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor)+117 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)+343 System.Web.Mvc.Controller.ExecuteCore()+116 System.Web.Mvc.ControllerBase.Execute(RequestContext-RequestContext)+97 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext RequestContext)+10 System.Web.Mvc.
c_DisplayClassb.
b_5()+37
System.Web.Mvc.Async.
c\u DisplayClass1.
b\u 0()+21
System.Web.Mvc.Async.
c\u DisplayClass8`1.
b\u 7(IAsyncResult)+12
System.Web.Mvc.Async.WrappedAsyncResult`1.End()+62
System.Web.Mvc.
c_DisplayClasse.
b_d()+50
System.Web.Mvc.SecurityUtil.
b_0(操作f)+7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(操作)+22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+60
System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.EndProcessRequest(IAsyncResult结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8841105
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+184

版本信息:Microsoft.NET Framework版本:4.0.30319;ASP.NET版本:4.0.30319.1

你知道我做错了什么吗

我使用的是Autofac版本2.4.5.724


谢谢。

这条线路有问题

builder.Register<ITestInject>(c => new TestInject { TestString = "hi" });

与其他DI框架相比,这种方法是Autofacs的优势之一。当其他人开始向您想要公开的接口注册并最终实现时,Autofac从实际实现开始并最终实现该接口。这使得语法更清晰,尤其是在一个具体实现可以作为多个接口公开的情况下,所有这些接口都在一次注册中。

在当前Autofac MVC3实现中,默认情况下关闭动作注入

要启用它,请将参数传递给
ExtensionActionInvoker

builder.RegisterType<ExtensibleActionInvoker>()
    .As<IActionInvoker>()
    .WithParameter("injectActionMethodParameters", true);
builder.RegisterType()
.As()
.WithParameter(“injectActionMethodParameters”,true);

这是一个非常新的更改,一些文档需要更新-抱歉,麻烦了。

在这种情况下不是这样-一般参数类型在大多数情况下被忽略,实际上应该被排除。啊,假设仍然是所有失败的根源:)我听到了,每次都会得到:)
builder.RegisterType<ExtensibleActionInvoker>()
    .As<IActionInvoker>()
    .WithParameter("injectActionMethodParameters", true);