C# 如何在ASP.NET MVC 4中使用Autofac注入HttpContextBase
我使用的是C# 如何在ASP.NET MVC 4中使用Autofac注入HttpContextBase,c#,asp.net,asp.net-mvc,asp.net-mvc-4,autofac,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Autofac,我使用的是ASP.mvc4和Autofac 我已在我的global.asax.cs文件中注册了以下内容: ContainerBuilder builder = new ContainerBuilder(); builder.Register(c => c.Resolve<HttpContextBase>().Request) .As<HttpRequestBase>() .InstancePerHttpRequest(); builder.Re
ASP.mvc4
和Autofac
我已在我的global.asax.cs
文件中注册了以下内容:
ContainerBuilder builder = new ContainerBuilder();
builder.Register(c => c.Resolve<HttpContextBase>().Request)
.As<HttpRequestBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Response)
.As<HttpResponseBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Server)
.As<HttpServerUtilityBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Session)
.As<HttpSessionStateBase>()
.InstancePerHttpRequest();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<WebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();
我在一个ASP.NETMVC3项目中使用了完全相同的代码,效果很好。现在在这个项目中,我遇到了一些错误。不知道为什么?我得到的错误是:
在类型“MyProject.Web.Controllers.HomeController”上找到的具有“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数都不能使用可用服务和参数调用:无法解析构造函数“Void.ctor(System.Web.HttpContextBase)”的参数“System.Web.HttpContextBase httpContext”。Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1参数)处的Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1参数)处的Autofac.Core.Resolving.InstanceLookup.Execute(),Autofac.Core.Resolving.Resolving.ResolvingOperation.GetOrCreateInstanceAutofac.Core.Resolving.InstanceLookup.ResolveComponent(ISharingLifetimeScope currentOperationScope,IComponentRegistration,IEnumerable
1参数)的Autofac.Core.registration.ExternalRegistrarySource(ISharingLifetimeScope,IComponentRegistration,IEnumerable1参数)。多亏了nemesv
我最终取代了:
builder.Register(c => c.Resolve<HttpContextBase>().Request)
.As<HttpRequestBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Response)
.As<HttpResponseBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Server)
.As<HttpServerUtilityBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Session)
.As<HttpSessionStateBase>()
.InstancePerHttpRequest();
它现在可以工作了。不确定区别是什么,但模块中的代码看起来与上面我的代码完全相同。我看不出在您的代码中您在哪里注册HttpContextBase
本身…尝试使用builder.RegisterModule(新的AutofacWebTypesModule())注册AutofacWebTypesModule
)是的,我现在在他们的网站上看到了这一点。我是否先注册AutofacWebTypesModule
然后再注册builder.register(c=>c.Resolve().Request)
。?在这种情况下,注册顺序应该无关紧要。如果你查看的源代码,你会发现你漏掉了最重要的一行builder.register(c=>newhttpcontextwrapper(HttpContext.Current)).As().instanceperhtprequest();
它注册了HttpContextBase
builder.Register(c => c.Resolve<HttpContextBase>().Request)
.As<HttpRequestBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Response)
.As<HttpResponseBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Server)
.As<HttpServerUtilityBase>()
.InstancePerHttpRequest();
builder.Register(c => c.Resolve<HttpContextBase>().Session)
.As<HttpSessionStateBase>()
.InstancePerHttpRequest();
builder.RegisterModule(new AutofacWebTypesModule());