`

IronRuby: Rails-Like MVC without Rails

阅读更多
IronRuby是.NET下的一个Ruby实现,此外还有Ruby.net这一开源项目,二者的主要区别是IronRuby利用了Microsoft最新推出的DLR,而ruby.net则是完全利用原有的CLR实现的,二者的比较可以参考lam John的相关文章。目前IronRuby (SVN r118) 100% 兼容于Ruby 1.5.0规格书,可以顺利运行RubySpec的所有测试与例子,因此大部分Ruby程序都可以不加修改的运行在IronRuby之上,其中包括Rails.

IronRuby的一大特点是,它是基于Microsoft的DLR,因此除了分享ruby世界的资源外,它也可充分利用.NET的庞大资源,例如LINQ,这意味着.NET中的ruby世界,别有一番天地。你可以组合ASP.NET MVC和active record,或者是rails +LINQ,或者完全不需要rails,这完全取决于你的创造力。Lam John演示了如何利用ASP.NET MVC完全实现类似Rails的架构与功能.

先来个简单的"Hello,world"级别的。首先设置routes.(ASP.NET MVC的route)

$routes.map_route "{controller}/{action}/{id}"
{ :controller='Home', :action='index', id=''}


然后与rails的程序类似,开始contoller的编写:
class HomeController < Controller
   def index
     view HomeModel.new
   end
end


和rails不一样的地方在于,其继承的父类是ASP.NET MVC的Controller类 ,而不是rails的ApplicationController.

最后在models目录下放入HomeModel.rb,我们的数据来自于内存。
class HomeModel 
  def salutation
   "Hello,World"
  end
end


然后是一个最简单的page,你可以命名成aspx,或者遵循ruby世界的规则,以rhtml为后缀,views\home\index.rhtml.
<h2>$model.saluation</h2>


这是一个最简单的MVC例子,稍后是更复杂的例子Controller它有两个action:index和list.
require "helper/contoller"
require "ProductModel"
class ProductsController < BaseController
   def index 
     model=ProductsModel.new
     @message="Hi,Mom"
     @categories=mode.get_categories
     return_view
   end

   def list
    @category=params[:id]
    model=ProductsModel.new
    @products=mode.get_products_for_category @category
    return_view
   end
end 


这里特别指出的,暂时我们用实例变量与view端通讯,但是Lam John承诺,目前只是作为原型来研究而已,以后必然会做出修改。接下里的model就更简单,它只是visual studio包装的northwind数据库的适配器,这里用到了我后面提到的"mokey patch"方法,从而将C#的GetCategory映射成ruby的get_category.
require "helpers/model"
class ProductsModel <NorthWindDatabase
//do nothing
end

NorthWindDatabase是个C#的类
public class NorthWindDatabase :NorthWindResposity{
  public List<Category> GetCategories(){
    return Categories.ToList();
  }
 public Category GetCategory(String name){
   return Categories.SingleOrDefault(c =>C.CategoryName==name);
 }

 public List<Product> getProductsForCategory(String name){
   var category=GetCategory(name);
   var products= from p in Products where p.CategoryId==category.CategoryId select p;
   return products.ToList();
 }
}

如果你觉得利用Visual studio生成NorthWind的wrapper不符合你的ruby习惯,那么完全可以把ProductsModel改成ActiveRecord的实现。

view端
  <% $view_data.categories.each{|category|%>
   <li> <a href="/products/list/<%=category.category_name%>">
       <%=category.category_name%></a>
   </li>
 <%
  }
%>


这次view端是完全的asp.net
分享到:
评论
2 楼 ray_linn 2008-11-13  

另外为了在Asp.net中使用ruby的route而不是原有的xml config,需要简单添加一行代码到Global.asax中去。

public class GlobalApplication : System.Web.HttpApplication
{
  protected void Application_Start()
  {
    RouteTable.Routes.LoadFromRuby();
  }
}


定义的routes.rb应该存放在web应用的根目录下。另外ironruby使用了一种称为"mokey patch"方法,(详细可见http://en.wikipedia.org/wiki/Monkey_patch) 以便在运行时修改类或者实例的行为,而不需要修改任何源代码。比如C#代码中的index["key"],可以被映射成ironruby的
$indexobject.key,  其内部实现机理如下:

ScriptRuntime runtime = IronRuby.CreateRuntime();
ScriptEngine rubyengine = IronRuby.GetEngine(runtime);
RubyExecutionContext ctx = IronRuby.GetExecutionContext(runtime);

ctx.DefineGlobalVariable("indexer", new Indexer());
string requires = 
@"require 'My.NameSpace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...'

def $indexer.method_missing(methodname)
  $indexer.get_Item(methodname.to_s)
end
";

//pretend we got the ruby script I really want to run from somewhere else
string rubyScript = GetRubyCode();

string script = requires + rubyScript;
ScriptSource source = rubyengine.CreateScriptSourceFromString(script);
runtime.ExecuteSourceUnit(source);


动态生成脚本与运行之。
1 楼 wosmvp 2008-11-13  
看了一眼,view 的 html 代码有错误……

写着写着怎么出来纯ASP.NET!!了?

相关推荐

    JavaEye论坛热点_-_2008年11月_-_总第6期

    3. **IronRuby: Rails-Like MVC without Rails** - IronRuby是.NET框架下的Ruby实现,允许开发者利用.NET平台的动态语言运行时(DLR)构建类似Rails的MVC架构应用,但不依赖Rails框架。这为.NET开发者提供了更多...

    ironruby-pre-alpha1.zip_pre

    这个“ironruby-pre-alpha1.zip_pre”文件是IronRuby项目的早期预览版本,即Pre-Alpha1阶段的源代码。在这一阶段,代码可能包含了初步的功能实现,但稳定性、性能和完整性都还有待提高,对于开发者,尤其是对Ruby和...

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码).rar

    《IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码)》是一个压缩包,其中包含了关于IronRuby和ASP.NET技术的博客资源。这个压缩文件的重点在于它提供了IronRuby在ASP.NET环境中的应用实例,这对于理解...

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1.zip源码ASP.NET网站源码打包

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1.zip源码ASP.NET网站源码打包[博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1.zip源码ASP.NET网站源码打包[博客空间]IronRuby博客中文版 Alpha_...

    程序源码 IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    IronRuby博客中文版_多用户博客空间源码下载.rar

    5. **Alpha版本**:"IronRuby博客中文版 Alpha_ironruby-pre-alpha1"表明这是软件的早期测试版本,可能存在一些未解决的问题或功能不完善之处。对于开发者来说,这意味着需要有调试和解决问题的能力,同时也可能有...

    ruby 2.4.4 X64

    由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生...

    Ruby语言教程.docx

    - **IronRuby:** 针对.NET框架的Ruby实现。 - **MacRuby:** 集成于Objective-C环境下的Ruby实现。 #### 三、Ruby语言的核心概念 **基本概念:** - **变量:** Ruby中的变量无需事先声明类型,直接赋值即可使用...

    精通C#5.0与.net4.5高级编程.

    - 动态类型:动态类型允许在运行时确定变量的类型,增强了语言的灵活性,特别适合与动态语言如IronPython或IronRuby交互。 - 自动属性初始化器:简化了属性的初始化过程,可以在声明属性时同时赋值。 - 遍历接口...

    ASP.NET源码——[博客空间]IronRuby博客中文版 Alpha.zip

    6. **MVC架构**:如果涉及ASP.NET MVC,可能会讲解如何使用IronRuby构建模型-视图-控制器结构的应用。 7. **错误处理和调试**:分享在IronRuby中处理异常和调试代码的方法。 8. **性能优化**:提供有关提高...

    Rails for .NET Developers (Facets of Ruby)

    **标题与描述解析:** 本书最后还讨论了Ruby on Rails如何影响微软的应用开发生态系统,尤其是通过IronRuby项目。 **知识点:** 1. **IronRuby项目:** IronRuby是Microsoft的一项计划,旨在使Ruby语言能够在.NET...

    Sams.IronRuby.Unleashed.Feb.2010.pdf

    根据给定文件的信息,我们可以提炼出关于IronRuby的详细知识点,包括其背景、特性以及与Microsoft .NET Framework的关系。以下是对这些方面的深入探讨: ### IronRuby:Microsoft .NET上的Ruby **IronRuby**是...

    vs2010新功能介绍

    这在与动态语言(如IronPython或IronRuby)交互或者处理非类型安全的API时特别有用。 4. **可独立拖放的窗口**: - VS2010改进了工作区布局,允许开发者将代码编辑器、解决方案资源管理器、调试器和其他工具窗口...

    IronRuby开发包(Pre Alpha1)

    IronRuby 是 Ruby 编程语言在微软 .NET 平台上的一种实现。 IronRuby 与 Wilco Bauwer 的 IronRuby project 同名,2007年4月30日由微软于 MIX 上发表。并计划于2007年的 OSCON 公开推出。 2007年8月31日,John Lam...

    [IronRuby] C# 4.0调用ActiveRecord

    IronRuby与Ruby一样支持动态类型系统、元编程和Ruby on Rails框架。 知识点二:C# 4.0 C# 4.0是微软公司开发的面向对象的编程语言,它是.NET框架的一部分。C# 4.0引入了动态类型(dynamic),协变和逆变,可选参数...

    Visual Studio 2010 and .NET 4 Six-in-One part1

    Delves into other .NET languages, such as IronRuby and IronPython About the Author István Novák is a Microsoft MVP in Visual C# and an associate of Grepton, a Hungarian IT services company. Andrá...

    Silverlight 2系列

    在Silverlight 2 Beta 1版本中,引入了对多种编程语言的支持,包括Visual Basic、Visual C#、IronRuby和IronPython,这极大地扩展了开发者的工具箱。此外,新版本加强了数据和服务的交互能力,支持JSON、Web Service...

    net 4.0 4.5 4.5.1 4.6 4.6.1

    - Dynamic Language Runtime (DLR)的增强,使得动态语言如IronPython和IronRuby的性能得到提升。 - Entity Framework 4.0,提供了ORM(对象关系映射)工具,简化了数据库操作。 - WCF RIA Services,简化了客户端...

Global site tag (gtag.js) - Google Analytics