【问题标题】:How to inject HttpContextBase using Autofac in ASP.NET MVC 4如何在 ASP.NET MVC 4 中使用 Autofac 注入 HttpContextBase
【发布时间】:2013-08-02 20:09:39
【问题描述】:

我正在使用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();

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

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.构造函数'Void .ctor(System.Web.HttpContextBase)'的Web.HttpContextBase httpContext'。在 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 参数) 在 Autofac.Core.Resolving.InstanceLookup.Execute() 在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration注册,IEnumerable1 parameters) at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable1 参数)在 Autofac.Core.Registration.ExternalRegistrySource。

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

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

【问题讨论】:

  • 我没有在你的代码中看到你在哪里注册HttpContextBase本身...尝试用builder.RegisterModule(new AutofacWebTypesModule());注册AutofacWebTypesModule
  • 是的,我刚刚在他们的网站上看到了这个。我要先注册AutofacWebTypesModule,然后再注册builder.Register(c =&gt; c.Resolve&lt;HttpContextBase&gt;().Request)..?
  • 在这种情况下,注册顺序无关紧要。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 autofac


【解决方案1】:

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

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

【讨论】:

  • 如果您查看AutofacWebTypesModule 的源代码,您会发现您遗漏了注册HttpContextBase 的最重要的行builder.Register(c =&gt; new HttpContextWrapper(HttpContext.Current)) .As&lt;HttpContextBase&gt;() .InstancePerHttpRequest();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多