#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