Как сделать сайт ASP.NET MVC модульным

14

Я нахожусь на этапе планирования создания системы интрасети для сотрудников с помощью ASP.NET MVC 4. Мы бы хотели, чтобы сайт состоял из отдельных «модулей», каждый из которых предоставляет различные функции: обмен сообщениями, изменение заработной платы и т. Д. Я хотел бы, чтобы эти модули были включены или отключены во время компиляции. На домашней странице будет отображаться какая-то навигация, которая будет ссылаться на каждый загруженный модуль.

Пока это просто, но я не хочу, чтобы навигационная функция заранее знала о модулях. Другими словами, я хочу, чтобы модули были динамически обнаруживаемыми; Я хочу иметь возможность написать код для нового модуля, а затем добавить ссылку на панель навигации без каких-либо изменений кода в другом месте источника. Каждый модуль должен иметь какой-либо способ регистрации с помощью панели навигации, и, что более важно, это должно быть сделано для каждого модуля при его загрузке.

Я считаю, что это исключает использование областей MVC, так как они предназначены для случая, когда макет сайта известен заранее. MEF кажется, что это может быть уместно, хотя люди, кажется, имели смешанный успех в сочетании MEF с MVC. Действительно ли MEF - путь сюда, или есть лучший способ выполнить то, что мне нужно?

bdesham
источник
Хороший вопрос, я чувствую, что ваше решение, вероятно, будет вращаться вокруг отражения. Вы по-прежнему можете использовать области при создании своих элементов, но ваш метод построения меню должен будет использовать отражение, чтобы получить все ваши типы (чтобы сохранить изменяющийся код). А что если все они реализуют один и тот же интерфейс IModule? Затем вы могли бы найти все наследники интерфейса, чтобы получить все модули, на которые нужно ссылаться, и проблема в том, как именно вы собираетесь связать это со ссылкой без каких-либо дополнительных данных? Хм, сюжет утолщается ...
mattytommo
1
Похоже, вы хотите создать CMS, за исключением того, что вместо администрирования CMS из CMS вы хотите, чтобы это было сделано во время сборки. Что приводит меня к вопросу, почему вы хотите, чтобы это было сделано во время сборки?
Джеймс П. Райт
@ JamesP.Wright Ну, причина, по которой я хотел сделать это во время сборки, была просто потому, что казалось, что это будет проще, чем показывать эту функциональность через страницу на сайте. (Кроме того, набор используемых модулей будет меняться достаточно редко, поэтому дополнительные издержки такого динамического выбора не требуются.) Но на самом деле более важным, чем выбор модулей во время сборки, является способность приложения находить модули в первое место, которое больше направлено на мой вопрос.
bdesham
nopCommerce ( nopcommerce.com/documentation.aspx ) частично является хорошим примером того, что вы хотите. Посмотрите, как написать плагин и их подход для DI.
Руи Маркес
В исследовательских целях мне было любопытно, каков «смешанный успех» в объединении MEF и MVC. Поскольку в настоящее время codeplex является «Жить в архиве», ссылка, предоставленная ОП, больше не работает. Чтобы сэкономить время: найдите с помощью ctrl + f «MEF2 с MVC4 через Microsoft.Composition» на вкладке для обсуждения на archive.codeplex.com/?p=mef ;)
Кевин,

Ответы:

4

Сначала я хотел бы иметь централизованный класс, который используется для регистрации приложений с помощью статического конструктора и статического члена. Список модулей, которые были в системе. Модули будут иметь статическое свойство, указывающее, является ли это элементом меню или нет, и в каком порядке он должен отображаться в меню.

Каждый модуль будет иметь свой собственный статический конструктор, который будет отмечать себя в централизованном классе, который отслеживает модули.

Думайте об этой системе больше как о системе часов времени, в которую приходят и работают сотрудники. Затем, во время расчета заработной платы, мы знаем, что должны платить всем сотрудникам в зависимости от того, кто работал и т. Д.

Отражение также можно использовать, если у вас есть интерфейсный контракт для модулей, которые они должны наследовать, что связывает с ним информацию мета-свойства.

Я работал в Warner Brothers Music и создал внутреннюю систему обработки музыки для разных форматов кодирования. Я сделал общую модель плагина для кодирования с отражением, которая использовала наследование, чтобы можно было преобразовать тип с отражением, чтобы получить основные мета-свойства класса. Я не пытался использовать статический централизованный класс, хотя. Просто подумал об этом случайно, как еще один способ попробовать для развлечения.

Я также хотел бы добавить, что я использовал MVC для обслуживания нескольких клиентов с базовыми требованиями, но также с расширенными функциями, аналогичными тем, что вы пытаетесь сделать. Вместо этого я преобразовал MVC в использование App_Code вместо необходимости компиляции. Таким образом, файлы легче выгружать без необходимости централизованной компиляции.

Вы можете использовать JIT с помощью простого проталкивания по FTP или GIT, вместо того чтобы компилировать локально и распространять DLL.

Вот ссылка на эту статью о переполнении стека

Джейсон Себринг
источник
Это похоже на то, что я представлял. Единственная проблема, как мне загрузить модули в первую очередь? По какому механизму я говорю каждому из них зарегистрироваться в центральном классе? Вот где MEF казалось, что это может быть уместно.
bdesham
MEF лучше. Я давал идеи, не вдаваясь в подробности, но я бы использовал MEF, если бы этот вариант отсутствовал, когда я делал эти проекты. Похоже, хорошая идея. Я не понимаю, почему вы не можете объединить MEF и MVC.
Джейсон Себринг