Реализация MEF с ASP.NET MVC? - PullRequest
       43

Реализация MEF с ASP.NET MVC?

33 голосов
/ 17 апреля 2009

Я пытаюсь выяснить, есть ли у кого-нибудь опыт или идеи использования MEF (Managed Extensible Framework (новая интегрированная среда Microsoft)) с ASP.NET MVC. Мне нужно создать стандартный ASP.NET MVC, который у меня есть. Но мне нужно предложить дополнительную функциональность, например, Views, Controllers и т. Д., В зависимости от того, добавляю ли я плагин. Его не нужно динамически компилировать, например, исходный код ... но DLL, которую я вставил в систему ...

Есть ли способ динамически загрузить DLL при запуске приложения, а затем MERGE VIEWS и CONTROLLERS с основной системой? Я не знаю, нахожусь ли я на правильном пути здесь.

Затем, я предполагаю, что в «СТАНДАРТНЫХ» представлениях, которые поставляются с приложением, я могу использовать «ЕСЛИ ТО», чтобы узнать, загружен ли плагин и MERGE в пользовательском элементе управления.

Ну, я говорю здесь вслух, но я думаю, вы понимаете, к чему я клоню.

Есть идеи?

Ответы [ 6 ]

23 голосов
/ 22 апреля 2009

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

Что касается текущего проекта, над которым я работаю, у меня есть следующая проблема: Несколько сайтов с одинаковыми видами, только другие CSS-файлы. В настоящее время мне приходится дублировать представления, что приводит к проблеме обслуживания.
Я надеюсь, что смогу поместить эти представления в центральное место, используя MEF.

4 голосов
/ 11 сентября 2011

Мы используем тонны 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, доступные в Интернете.

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

4 голосов
/ 01 июня 2010

Проверьте это:

http://www.fidelitydesign.net/?p=104

Модульный ASP.NET MVC с использованием инфраструктуры управляемой расширяемости (MEF), часть первая, Мэтью Эбботт.

1 голос
/ 25 апреля 2009
1 голос
/ 17 апреля 2009

Это дикая догадка. Вы можете перезаписать фабрику контроллеров по умолчанию на фабрику, которая использует MEF для обнаружения IController s. Поскольку представления открыты по соглашению, вам не нужно беспокоиться о них.

0 голосов
/ 02 июня 2010

Я собрал подключаемую платформу с использованием MVC и MEF со строго типизированными представлениями по адресу: http://www.thegecko.org/index.php/2010/06/pluggable-mvc-2-0-using-mef-and-strongly-typed-views/

...