Я нахожусь на этапе планирования создания системы интрасети для сотрудников с помощью ASP.NET MVC 4. Мы бы хотели, чтобы сайт состоял из отдельных «модулей», каждый из которых предоставляет различные функции: обмен сообщениями, изменение заработной платы и т. Д. Я хотел бы, чтобы эти модули были включены или отключены во время компиляции. На домашней странице будет отображаться какая-то навигация, которая будет ссылаться на каждый загруженный модуль.
Пока это просто, но я не хочу, чтобы навигационная функция заранее знала о модулях. Другими словами, я хочу, чтобы модули были динамически обнаруживаемыми; Я хочу иметь возможность написать код для нового модуля, а затем добавить ссылку на панель навигации без каких-либо изменений кода в другом месте источника. Каждый модуль должен иметь какой-либо способ регистрации с помощью панели навигации, и, что более важно, это должно быть сделано для каждого модуля при его загрузке.
Я считаю, что это исключает использование областей MVC, так как они предназначены для случая, когда макет сайта известен заранее. MEF кажется, что это может быть уместно, хотя люди, кажется, имели смешанный успех в сочетании MEF с MVC. Действительно ли MEF - путь сюда, или есть лучший способ выполнить то, что мне нужно?
Ответы:
Сначала я хотел бы иметь централизованный класс, который используется для регистрации приложений с помощью статического конструктора и статического члена. Список модулей, которые были в системе. Модули будут иметь статическое свойство, указывающее, является ли это элементом меню или нет, и в каком порядке он должен отображаться в меню.
Каждый модуль будет иметь свой собственный статический конструктор, который будет отмечать себя в централизованном классе, который отслеживает модули.
Думайте об этой системе больше как о системе часов времени, в которую приходят и работают сотрудники. Затем, во время расчета заработной платы, мы знаем, что должны платить всем сотрудникам в зависимости от того, кто работал и т. Д.
Отражение также можно использовать, если у вас есть интерфейсный контракт для модулей, которые они должны наследовать, что связывает с ним информацию мета-свойства.
Я работал в Warner Brothers Music и создал внутреннюю систему обработки музыки для разных форматов кодирования. Я сделал общую модель плагина для кодирования с отражением, которая использовала наследование, чтобы можно было преобразовать тип с отражением, чтобы получить основные мета-свойства класса. Я не пытался использовать статический централизованный класс, хотя. Просто подумал об этом случайно, как еще один способ попробовать для развлечения.
Я также хотел бы добавить, что я использовал MVC для обслуживания нескольких клиентов с базовыми требованиями, но также с расширенными функциями, аналогичными тем, что вы пытаетесь сделать. Вместо этого я преобразовал MVC в использование App_Code вместо необходимости компиляции. Таким образом, файлы легче выгружать без необходимости централизованной компиляции.
Вы можете использовать JIT с помощью простого проталкивания по FTP или GIT, вместо того чтобы компилировать локально и распространять DLL.
Вот ссылка на эту статью о переполнении стека
источник
Вы можете посмотреть на использование MEF с MVC. Это дало бы вам возможность добавлять - убирать по мере необходимости без перекомпиляции или развертывания. Как обычно, Скотт - хорошее место для начала: http://www.hanselman.com/blog/ExtendingNerdDinnerAddingMEFAndPluginsToASPNETMVC.aspx
источник