#c# #asp.net-mvc-2 #dependency-injection #structuremap
#c# #asp.net-mvc-2 #внедрение зависимостей #structuremap
Вопрос:
Я создал фабрику пользовательских контроллеров, чтобы иметь возможность внедрять экземпляры служб в мои контроллеры с помощью StructureMap.
Все работает нормально, за исключением того, что при каждом запросе вызывается фабрика контроллеров, в первый раз, когда она правильно разрешает контроллер, и во второй раз, когда параметр controllerType равен null, и поэтому метод getInstance StructureMap выдает исключение ArgumentNullException: значение не может быть нулевым. Имя параметра: ключ.
На самом деле приложение не завершает работу, но если я выполняю отладку, оно всегда останавливается на этом, и мне приходится вручную продолжать выполнение, чтобы отобразить представление.
Кто-нибудь, пожалуйста, может объяснить, почему это происходит и как я мог бы это решить.
Вот код как из моего Global.asax, так и из фабрики контроллеров:
Фабрика контроллеров:
public class IocControllerFactory : DefaultControllerFactory
{
private readonly IContainer container;
public IocControllerFactory(IContainer container)
{
if(container == null) throw new ArgumentNullException("container");
this.container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return this.container.GetInstance(controllerType) as IController;
}
}
Global.asax
private void RegisterControllerFactory()
{
var ioc = new Container();
var controllerFactory = new IocControllerFactory(ioc);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
ioc.Configure(r =>
r.Scan(x =>
{
x.AssemblyContainingType<UserAccountController>();
x.AddAllTypesOf<IController>();
x.Include(t => typeof(IController).IsAssignableFrom(t));
}
));
ioc.Configure(r => r
.For<IUserAccountService>()
.Use<UserAccountService>());
}
Большое вам спасибо за любую помощь.
Ответ №1:
Помните, что ASP.NET MVC обрабатывает каждый запрос, который не сопоставляется с файлом, через фабрику контроллеров с конфигурациями по умолчанию. И большинство браузеров запрашивают значок.по умолчанию используется файл ico. Итак, происходит то, что вызывается ваш значок, но он не соответствует типу, поэтому StructureMap получает тип null и выдает ошибку.
Самые простые исправления — добавить значок.файл ico или добавление игнорирования для маршрута.
Комментарии:
1. Большое вам спасибо. Это была просто неприятность, но все равно раздражала.
2. Проблем нет. На самом деле это немного больше, чем просто помеха для сайта с высоким трафиком — вы получаете исключение для каждого запроса страницы, а исключения стоят дорого.