#asp.net #asp.net-mvc #dynamic #roslyn
#asp.net #asp.net-mvc #динамический #roslyn
Вопрос:
Теперь, когда Roslyn CTP открыт, мы можем попытаться придумать интересные вещи, которые мы можем с ним сделать, кроме написания сценариев на c #.
Поскольку asp.net mvc позволяет вам писать пользовательские фабрики контроллеров, можем ли мы написать фабрику, которая
- Компилирует контроллеры из исходного файла «на лету»
- Загрузите вновь созданный тип в среду выполнения (может ли среда выполнения справиться с этим?)
- И отмените предыдущий тип, если предыдущие запросы к тому же контроллеру уже были сделаны
Это позволило бы нам быстро создавать прототипы или изменять контроллеры, поскольку вы можете просто написать код, и controllerfactory получит изменения без необходимости перекомпиляции.
Комментарии:
1. Это можно сделать без Roslyn.
2. Взгляните на Orchard CMS: сегодня она динамически загружает модули из исходного кода.
3. Orchard делает это, компилируя csproj перед загрузкой сборок, но описывает его как «несколько экспериментальный»: orchardproject.net/docs /…
Ответ №1:
Я уже реализовал контроллеры среды выполнения, используя компилятор monos как сервис несколько месяцев назад.
Вы можете найти информацию и ссылку на код на github здесь: http://www.fusonic.net/en/blog/2011/04/01/scripting-asp-net-mvc-controllers-at-runtime /
Хотя вначале это выглядит действительно красиво, в реальном мире это не так уж и полезно из-за нескольких ограничений.
Прежде всего, Visual Studio стоит между вами и вашим кодом, потому что она строго блокирует и запрещает изменять исходный код во время отладки. Таким образом, единственный способ отредактировать ваши исходные файлы — запустить без подключенного отладчика.
Вторая проблема заключается в том, что она (очевидно) ограничена контроллерами. Как только вы начнете редактировать свои контроллеры во время выполнения, вам понадобится настоящая среда сценариев! Например, для изменения ваших моделей, служб и любого кода, который у вас есть в вашем проекте во время выполнения.
Тогда у вас возникает проблема, заключающаяся в том, что вы не можете отлаживать свой динамический код и так далее…
Я перестал использовать его через несколько дней, потому что это просто неполное решение. Я мечтаю о решении для .net, где весь mvc-проект может быть динамически скомпилирован во время выполнения, не ограничиваясь контроллерами (например, реальной средой сценариев) и включая отладку.
В мире java для этого есть решение: http://zeroturnaround.com/jrebel /
Комментарии:
1. Так что это возможно, но с ним просто неудобно работать.
2. Я использую mono для этого в своем проекте asp mvc 3. Это действительно экономящий время подход, когда ваш проект большой.
Ответ №2:
Я не так много знаю о фабриках контроллеров MVC, но да, это звучит как то, что можно было бы сделать. Шаг 2 может быть выполнен со стандартной сборкой.Load() отправленного кода. Roslyn также имеет возможность компилировать в динамический метод, если это возможно, что еще легче.
Для соответствующего примера взгляните на прототип Razor view engine, созданный Дэвидом Эббо.
Комментарии:
1. Как именно мне превратить скриптлет в динамический метод?
Ответ №3:
Взгляните на скрипты. Я считаю, что раньше можно будет делать подобные вещи.