Используйте Roslyn для динамической компиляции контроллеров

#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:

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