ASP.Дважды вызывается завод пользовательских контроллеров Net MVC 2, и во второй раз тип контроллера равен нулю

#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. Проблем нет. На самом деле это немного больше, чем просто помеха для сайта с высоким трафиком — вы получаете исключение для каждого запроса страницы, а исключения стоят дорого.