2013-03-26 3 views
18

Я использую ASP.MVC 4 и Autofac.Как вводить HttpContextBase с использованием Autofac в ASP.NET MVC 4

Я зарегистрировал следующее в моем 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, и он работал нормально. Теперь в этом проекте возникают ошибки. Не знаете почему? Ошибка, я получаю это:

Ни один из конструкторов не найдено с «Autofac.Core.Activators.Reflection.DefaultConstructorFinder» на «типа MyProject.Web.Controllers.HomeController» может быть вызвана с помощью имеющихся услуг и параметров : Не удается разрешить параметр «System.Web.HttpContextBase httpContext» конструктора «Void .ctor (System.Web.HttpContextBase)». на Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance (контекст IComponentContext, IEnumerable 1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1 параметр) в Autofac.Core.Resolving.InstanceLookup.Execute() в Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance (ISharingLifetimeScope currentOperationScope, регистрация IComponentRegistration, IEnumerable 1 parameters) at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable 1 параметр) в Autofac.Core.Registration.ExternalRegistrySource. <

Я не слишком уверен, почему это не сработает? Нужно ли мне делать что-то по-другому в ASP.NET 4?

У меня есть отдельный проект, в котором я также хочу ввести HttpContextBase, и я получаю ту же ошибку.

+3

Я не вижу в вашем коде, где вы зарегистрировать 'HttpContextBase' сам ... Попробуйте зарегистрировать' 'AutofacWebTypesModule' с builder.RegisterModule (новый AutofacWebTypesModule());' – nemesv

+0

Да, я только что видел это сейчас на своем веб-сайте. Я регистрирую 'AutofacWebTypesModule' прежде, чем я буду делать builder.Register (c => c.Resolve (). Request)' ..? –

+0

В этом случае регистрационный заказ не должен иметь значения. – nemesv

ответ

30

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

Он работает в настоящее время. Не уверен, в чем разница, но код в модуле выглядит точно так же, как и мой.

+15

Если вы проверите исходный код [AutofacWebTypesModule] (https://code.google.com/p/autofac/source/browse/src/Source/Autofac.Integration.Web.Mvc3/AutofacWebTypesModule.cs?r=94f70ab10f4d65991c600e2e80171ce4847589e6) вы можете видеть, что вы оставили основную строку 'builder.Register (c => new HttpContextWrapper (HttpContext.Current)) . В качестве () .InstancePerHttpRequest();' который регистрирует 'HttpContextBase' – nemesv

+0

Спасибо за помощь. –

Смежные вопросы