2009-02-20 4 views
11

У меня есть идея дизайна для большого проекта на работе, и я думаю, что я это понял, но мне очень понравилось бы получить некоторые отзывы о) идее в целом и b) моей предложенной реализация.Добавление фабрики контроллеров в ASP MVC

Основная идея проста: я хочу создать приложение ASP MVC, которое может быть расширено в будущем с помощью дополнительных контроллеров и представлений без необходимости перекомпилировать код. Идея состоит в том, чтобы иметь одно приложение MVC с очень простым набором функций, а затем расширить функциональность, добавив еще одну «Application.dll», которая содержит контроллеры, данные и бизнес-логику, специфичные для этого приложения. Представления будут просто скопированы в тот же каталог, что и основное приложение MVC во время установки.

Проблема в том, что MVC выполняет свою маршрутизацию по типам внутри одной и той же сборки, поэтому, даже если я переведу определения маршрутизации в базу данных, MvcHttpHandler не сможет маршрутизировать что-то новое Dll, поскольку оно не «знает» типы контроллеров в нем. Посмотрев на код MVC, я обнаружил, что для загрузки контроллеров они просто называют Activator.CreateInstance, который выглядит только в текущей сборке.

Мое решение прост, но, может быть, я что-то упустил: я переопределю MvcHttpHandler, либо напрямую заменив ControllerFactory (не уверен, как это сделать), либо дублируя эту функциональность в производном классе. Новый код прочитает запрос и попытается сначала загрузить контроллер из текущей сборки, а затем из расширенных. Как только соответствующая сборка будет найдена, я буду использовать CreateInstance и передать эту сборку, чтобы получить контроллер, который я хочу.

ответ

6

В конце this article показано, как реализовать свой собственный ControllerFactory. В принципе, вы выходите из DefaultControllerFactory, а затем подключаете его в Application_Start() в свой global.asax.

+0

Спасибо, Бен. Это то, что я искал. – Gil

1

Нет ничего плохого в идее фабрики контроллеров, если это просто для гибкости позже. проблема si при загрузке контроллеров с кодом, который принадлежит другим слоям, что является одной из причин, по которой вам может понадобиться гибкость других контроллеров. Пока вы не мешаете слоям togehter, я не вижу реальной проблемы с фабричной идеей.

Смежные вопросы