Фабрика пользовательских контроллеров ASP .Net MVC 2 вызывается дважды, а второй раз controllerType имеет значение null - PullRequest
0 голосов
/ 11 ноября 2011

Я создал собственную фабрику контроллеров, чтобы иметь возможность внедрять экземпляры сервисов в мои контроллеры с помощью 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 Ответ

2 голосов
/ 11 ноября 2011

Помните, что ASP.NET MVC обрабатывает каждый запрос, который не сопоставляется с файлом через фабрику контроллеров с конфигурациями по умолчанию. И большинство браузеров по умолчанию запрашивают файл favicon.ico. Итак, происходит то, что вызывается ваш favicon, но он не сопоставляется с типом, поэтому StructureMap получает нулевой тип и выдает ошибку.

Простейшие исправления - добавить файл favicon.ico или игнорировать маршрут.

...