Для этого модуля требуется, чтобы HttpApplication реализовал IContainerProviderAccessor

#asp.net-mvc #autofac

#asp.net-mvc #autofac

Вопрос:

Привет, я хочу использовать Autofac в моем asp.net приложение mvc, и вот код, который у меня есть в глобальном файле.asxc :

  protected void Application_Start()
    {
        ....

        var builder = new ContainerBuilder();
        builder.RegisterControllers(Assembly.GetExecutingAssembly());

        IContainer container = builder.Build();

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

    }
  

но когда я запускаю проект, я вижу эту ошибку :

Для этого модуля требуется, чтобы HttpApplication (глобальный класс приложения) реализовал IContainerProviderAccessor

что не так?

Комментарии:

1. Я думаю, что я сам нашел ответ! Сначала я запустил IContainerProviderAccessor, затем я инициализировал IContainerProvider _containerProvider в Application_Start() следующим образом: _containerProvider = new ContainerProvider(builder. Build()); а затем инициализировал контейнер следующим образом: IContainer container = _containerProvider. ApplicationContainer; кажется, что все работает нормально.

2. Привет — не могли бы вы, пожалуйста, обратить внимание на версии Autofac и MVC, которые вы используете? Это сообщение никогда не должно появляться в последних версиях. Возможно, вам потребуется удалить записи из Web.config.

Ответ №1:

У меня была та же проблема, что и у OP, но мое решение было другим.

Отсюда:

Удалите старые элементы

  • Удалите интерфейс IContainerProviderAccessor из Global.asax.Эта реализация больше не используется ASP.NET Интеграция с MVC.
  • Удалите ссылки на AutofacControllerFactory.Вместо этого новая интеграция с MVC использует класс MVC DependencyResolver для интеграции.
  • Удалить ASP.NET Автоматическое изменение конфигурации HTTP-модуля.Ранее в вашем web.config требовались некоторые модули автоматического удаления контейнера и ввода свойств. Их следует удалить.

Комментарии:

1. Я только удалил старый ASP.NET Автоматическая настройка HTTP-модуля из файла web.config. У меня это работает:-D

Ответ №2:

Минимальная глобальная настройка.asax.cs для autofac для asp.net mvc3 мог бы выглядеть следующим образом: (RegisterRoutes удален из кода). В отличие от предыдущих версий asp.net mvc (из http://code.google.com/p/autofac/wiki/Mvc3Integration )

классу HttpApplication больше не нужно реализовывать интерфейс IContainerProviderAccessor, как описано в ASP.NET Документация по интеграции. Весь код, связанный с реализацией интерфейса, должен быть удален из вашего глобального файла.asax.cs.

Вам также понадобится ссылка на Autofac.Integration.Mvc.dll

 using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac;
using Autofac.Integration.Mvc;

namespace ApplicationX
{
    public class MvcApplication : HttpApplication
    {
        private static IContainer _container;

        /// <summary>
        /// Gets the container.
        /// </summary>
        public IContainer Container
        {
            get { return _container; }
        }

        // RegisterRoutes and RegisterGlobalFilters removed ...

        /// <summary>
        /// Fired when the first resource is requested from the web server and the web application starts
        /// </summary>
        protected void Application_Start()
        {
            // Register: create and configure the container
            _container = BootstrapContainer();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(_container));

            // MVC Stuff
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

        /// <summary>
        /// Fired when the web application ends
        /// </summary>
        public void Application_End()
        {
            // Release: remember to dispose of your container when your application is about to shutdown to let it gracefully release all components and clean up after them
            _container.Dispose();
        }

        /// <summary>
        /// Bootstrapper is the place where you create and configure your container
        /// </summary>
        /// <returns>An Autofac container</returns>
        private IContainer BootstrapContainer()
        {
            var builder = new ContainerBuilder();
            // You can make property injection available to your MVC views by adding the ViewRegistrationSource to your ContainerBuilder before building the application container.
            builder.RegisterSource(new ViewRegistrationSource());
            // An example of a module that registers the dependencies for a ServiceLayer of your application
            builder.RegisterModule(new ServiceModule());
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            return builder.Build();
        }
    }
}
  

Комментарии:

1. кстати, вы знаете что-нибудь о orchard project? Честно говоря, я хочу разработать mvc-приложение, состоящее из модулей, с использованием Autofac.

2. @persian-dev Я слышал об этом, но еще не работал с ним. Я отредактировал приведенный выше пример кода, чтобы включить регистрацию пользовательского модуля. Как создать модуль, задокументировано на http://code.google.com/p/autofac/wiki/StructuringWithModules