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