Я разрабатываю инфраструктуру плагинов для ASP.NET MVC3 с использованием представлений Razor, и у меня возникла проблема с тем, чтобы встроенные представления работали правильно.
Каркас плагина имеет следующие особенности:
- Каждый плагин имеет свои модели, контроллеры и представления. Представления: встроенные ресурсы , а контроллеры являются производными от класса PluginController
- Плагины имеют ссылки на зависимости от общей библиотеки классов, которая определяет базовый класс PluginController
- Веб-приложение "shell", в котором размещаются плагины , не должно содержать ссылок на какие-либо плагины во время разработки , поскольку во время разработки оно не знает, какие плагины оно имеет.
- DLL-файлы плагина сбрасываются в папку в приложении оболочки, которая является , а не папкой / bin
- Оболочка заботится о:
- Обнаружение плагинов (используя отражение)
- Регистрация всех контроллеров (для этого я использую Spring.Net)
- Создание маршрутов к контроллерам
- Обслуживание бритвенных файлов (cshtml) через пользовательский VirtualPathProvider
Теперь все работает нормально, кроме случаев, когда встроенные представления имеют ссылки на типы в dll плагина. Тогда я получаю позорную ошибку (имена опущены):
The type or namespace name '[Plugins]' does not exist in the namespace '[MyPluginSolution]' (are you missing an assembly reference?)
Причина этого заключается в том, что компилятор csc, который вызывается во время выполнения для компиляции видов бритв , получает только ссылки на dll из папки bin и GAC .
Я также пытался предварительно скомпилировать представления, используя эту технику , но в конце она дает те же результаты, так как среда выполнения настаивает на компиляции оболочки для предварительно скомпилированного представления бритвы.
Конечно, я мог бы удалить плагин dll в папке / bin, но мой вопрос:
Есть ли способ зарегистрировать dll в папке не-bin (и не-GAC) и обращаться с ними как с "первоклассными гражданами", чтобы их могли использовать виды бритвы?