21

我正在使用ASP.MVC 4Autofac

我在我的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();

在我的家庭控制器中,我有这个(仅用于测试目的):

private readonly HttpContextBase httpContext;

public HomeController(HttpContextBase httpContext)
{
     this.httpContext = httpContext;
}

我在 ASP.NET MVC 3 项目中使用了完全相同的代码,它运行良好。现在在这个项目中我遇到了错误。不知道为什么?我得到的错误是:

在“MyProject.Web.Controllers.HomeController”类型上使用“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找到的任何构造函数都不能使用可用的服务和参数调用:无法解析参数“System.Web.HttpContextBase httpContext”构造函数'Void .ctor(System.Web.HttpContextBase)'。在 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable 1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 参数) 在 Autofac.Core.Resolving.InstanceLookup.Execute() 在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration 注册, IEnumerable 1 parameters) at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable1 个参数)在 Autofac.Core.Registration.ExternalRegistrySource.<

我不太确定为什么这不起作用?我需要在 ASP.NET 4 中做不同的事情吗?

我有一个单独的项目,我也想在其中注入HttpContextBase,但我遇到了同样的错误。

4

1 回答 1

34

感谢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();

...只需:

builder.RegisterModule(new AutofacWebTypesModule());

现在可以了。不知道有什么区别,但模块中的代码看起来和我上面的完全一样。

于 2013-03-26T14:17:37.547 回答