使用Roslyn动态编译控制器

时间:2011-10-21 09:24:39

标签: asp.net asp.net-mvc dynamic roslyn

随着Roslyn CTP的公开发布,除了编写c#脚本之外,我们可以尝试用它来思考我们可以做的很酷的事情。

由于asp.net mvc允许你编写自定义控制器工厂,我们可以写一个工厂

  • 动态编译源文件中的控制器
  • 将新创建的类型加载到运行时(运行时可以处理吗?)
  • 如果先前已对同一控制器发出请求,则取代之前的类型

这将允许我们快速原型化或更改控制器,因为您可以简单地编写代码,而controllerfactory将在不需要重新编译的情况下获取更改。

3 个答案:

答案 0 :(得分:5)

几个月前,我已经使用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)

我对MVC控制器工厂了解不多,但是,听起来好像可以做到。可以使用发出的代码的标准Assembly.Load()完成步骤2。如果可能的话,Roslyn还能够编译成动态方法,重量更轻。

有关相关示例,请查看David Ebbo汇总的原型Razor view engine

答案 2 :(得分:1)

看看ScriptCs。我相信很快就可以做到这样的事情。