Ответ 1
1) Я бы не рекомендовал, чтобы ваши представления напрямую использовали внешние ссылки или динамически загруженные внешние ссылки. Прочтите это, если ваше представление взаимодействует с контроллером. Сделайте ваш контроллер подает объект данных в ваше представление, которое известно во время сборки вашим приложением (другими словами, объект, известный вашему веб-приложению во время сборки). Это полностью изолировать (абстрактный) плагин определенного бизнеса от вашего представления. Затем сделайте ваш контроллер взаимодействующим с "плагином".
2) Я не знаю, как работает ваш "пользовательский factory", но в настоящее время мы больше не создаем никаких "настраиваемых фабрик". Вместо этого мы используем контейнеры для инъекций зависимостей, такие как Microsoft Unity (или Ninject, или Castle Windsor или т.д.). Создание "настраиваемых фабрик" очень старомодно, и вы в основном изобретаете колесо, которое было разрешено с помощью инъекции зависимостей.
3) Что касается динамической загрузки внешних сборок, я не знаю, есть ли у вас это право, но здесь ссылка:
Динамически загружать тип из внешней сборки
4) Как правило, конструкция плагина предоставляет интерфейсы, которые известны вашему основному веб-приложению во время сборки. То, что скрывает дизайн плагина, - это реализация, которая может изменяться с одного плагина на другой. Важно то, что каждый плагин реализует те же общедоступные интерфейсы, которые ожидаются вашим основным веб-приложением. Обычно у вас будут эти интерфейсы в отдельном "общем" проекте, на который ссылаются как ваше основное веб-приложение, так и ваш плагин, который реализует эти интерфейсы. Поэтому из вашего основного веб-приложения вы узнаете, что такое публичные интерфейсы ваших плагинов, вы можете динамически загружать внешнюю сборку и использовать отражение С# для поиска классов, которые реализуют эти интерфейсы, и загружать их в контейнер для инъекций зависимостей. Кроме того, любой, кто захочет разработать плагин для вашего веб-приложения, должен будет реализовать интерфейсы, определенные в вашем "общем" проекте.
Примечание. "Обычный" - это просто случайное имя, которое я дал проекту. Вы можете назвать его "PluginInterface" или что угодно.
После этого, если ваш контроллер захватит все, что ему нужно из контейнера для инъекций зависимостей, тривиально.
Примечание. У ваших интерфейсов плагинов, вероятно, будут входные и выходные объекты. Эти объекты разделяются между вашим основным веб-приложением и вашим плагином. В этом случае, поскольку эти объекты являются частью ваших интерфейсов, они должны быть в "общем" проекте. Возможно, у вас возникнет соблазн, чтобы ваш контроллер вернул эти объекты прямо к вашему представлению, но тогда у вас не будет идеальной абстракции между вашим представлением и вашим плагином. Не иметь идеальных абстракций для другого обсуждения.
Надеюсь, что это поможет!