Custom Factory Controller, проблемы внедрения зависимостей / структурных карт в ASP.NET MVC - PullRequest
27 голосов
/ 06 апреля 2009

Недавно я пытался внедрить внедрение зависимостей, используя StructureMap. Мне удалось следовать примеру до конца, но я сталкиваюсь с выбрасываемым исключением каждый раз, когда пытаюсь запустить приложение. Вот некоторые фрагменты кода из моей фабрики контроллеров.

public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        if (controllerType == null)
            throw new ArgumentNullException("controllerType");

        return ObjectFactory.GetInstance(controllerType) as Controller;
    }
}

Мой Global.asax вызывает статический класс BootStrapper, который регистрирует все мои зависимости, но похоже, что GetControllerInstance StructureMapControllerFactory вызывается дважды. При первом вызове передается правильный controllerType, но при втором вызове он всегда равен нулю.

При первом вызове GetControllerInstance тип устанавливается в HomeController, что является правильным. Код запускается в HomeController и возвращает View (). По возвращении View () вызывается событие Page_Load для файла aspx. Пройдя через это, он достигает строки:

httpHandler.ProcessRequest (HttpContext.Current);

Вот где GetControllerInstance вызывается второй раз.

Вот мои биты Global.asax, которые могут иметь отношение:

   protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);

        Bootstrapper.ConfigureStructureMap();

        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
    }

Я очень заинтересован в том, чтобы заставить работать инъекцию зависимостей, и буду очень признателен, если кто-нибудь сможет мне помочь. :)

Ответы [ 2 ]

45 голосов
/ 06 апреля 2009

UPDATE Причина, по которой это происходит, заключается в том, что, когда изображение указано в файле CSS, и это изображение отсутствует, структура маршрутизации пытается сопоставить URL-адрес с контроллером. Игнорирование маршрутов, перечисленных ниже, предотвратит возникновение ошибки, но я решил не реализовывать ее, потому что это хороший способ уведомления о наличии недостающего ресурса.

Подробное объяснение вы можете увидеть вместе с примерами настройки внедрения зависимостей с использованием Структурной карты здесь .

У меня была та же самая проблема, и я думаю, что я понял это. По любой причине, когда вы пытаетесь предоставить свою собственную фабрику контроллеров, вам необходимо добавить пару дополнительных определений IgnoreRoute. Первое, что я хотел бы сделать, это добавить эту строку в ваш метод GetControllerInstance:

if(controllerType == null)
    return base.GetControllerInstance(controllerType)

Это, по крайней мере, даст вам больше информации в сообщении об ошибке относительно того, что запрос является причиной, что controllerType имеет значение null. В моем конкретном случае в моем css-файле было задано следующее фоновое изображение:

background: url(img/logo.gif);

Итак, что происходит, когда маршрутизация ищет контроллер под названием «img» и действие, которое принимает logo.gif или что-то в этом роде. Это явно не правильное поведение.

После некоторого копания я понял, что мне нужно добавить определение IgnoreRoute в мой файл Global.asax, которое будет игнорировать что-либо в каталоге «content» моего сайта, например:

routes.IgnoreRoute("{Content}/{*pathInfo}");

Я все еще не уверен, почему вам не нужно делать это с фабрикой ControllerFactory по умолчанию, но тем не менее это работает.

Возможно, вы столкнетесь с той же проблемой с favicon.ico. Особенно, если вы используете Google crhome. Вам также нужно добавить это:

routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"})
4 голосов
/ 06 апреля 2009

Я предполагаю, что вы запрашиваете статический файл, такой как файл javascript, который не был добавлен в ваш проект или, возможно, ссылка на него содержит опечатку. Вы должны следить за веб-запросами вашего браузера и искать веб-запросы, которые не могут правильно преобразовываться в статический файл, когда это необходимо. Вы можете использовать firebug в FF или fiddler, если вы используете IE для этого.

...