Мы используем тонны MEF в ASP.NET MVC, хотя большая их часть находится на уровне ниже уровня контроллера, так как в наших модулях нижнего уровня используются плагины MEF для проверки разрешений и проверки данных.
Однако мы также используем более компоновочный подход и к нашим контроллерам. Представления более сложные, но мы фактически полностью исключили использование обычных представлений ASP.NET MVC и сохранили наши представления Razor во фрагментах в базе данных. Затем наши контроллеры запрашивают у обработчика шаблонов представление во время выполнения и выводят ContentResult в ответ вместо возврата View («Viewname») и т. Д.
Все наши плагины MEF содержат свойства идентификатора, которые позволяют нам выполнять каскадное переопределение во время выполнения, чтобы выяснить, какой плагин / класс следует использовать для данной цели. Самый простой пример, который можно продемонстрировать, - это если вы подумаете о приложении, которое имеет общую базу, но развернуто в более чем 50 реализациях, каждая из которых имеет возможность переопределить основные функции.
Итак, у вас может быть что-то вроде IUserController, который включает методы для «Вход», «Выход из системы» и т. Д.
В дополнение к этим фактическим функциям мы добавили бы свойство GUID, доступное только для чтения, в интерфейс под названием «SiteId». Каждая реализация затем жестко кодирует идентификатор SiteId, для которого она предназначена. Для реализации «по умолчанию» в основном коде будет возвращено «Guid.Empty».
Затем, когда мы вызываем MEF и ищем, какую реализацию IUserController использовать, мы выполняем ImportMany из всех них в List, а затем используем LINQ для запроса свойств, чтобы выяснить, какое из них использовать: 1011 *
var _currentUserController = _availableUserControllers.FirstOrDefault(
c=>c.SiteId == AppSettings.SiteId);
if(_currentUserController == null){
//There is no site-specific override
_currentUserController = _availableUserControllers.FirstOrDefault(
c=>c.SiteId == Guid.Empty);
}
Чтобы сделать это с контроллерами, лучше всего взглянуть на некоторые реализации фабрик контроллеров на основе MEF, доступные в Интернете.
Однако, как я уже сказал, мы делаем почти все это на более низком уровне, и наши модули или контроллеры выполняют такой поиск, чтобы определить, какие плагины нужно запустить.