该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-13
最后修改:2010-05-11
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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-13
看了一眼,view 的 html 代码有错误……
写着写着怎么出来纯ASP.NET!!了? |
|
返回顶楼 | |
发表时间:2008-11-13
最后修改: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); 动态生成脚本与运行之。 |
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
wosmvp 写道 看了一眼,view 的 html 代码有错误……
写着写着怎么出来纯ASP.NET!!了? 最后的view端是用asp.net实现的。html改过来了,因为原来lam john给的代码是图片,我一个字一个字重新敲过。 |
|
返回顶楼 | |
发表时间:2008-11-13
语法上怎么是 def class AA end 而不是 class end? 这个语法兼容吗
|
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
重复贴,编辑掉.....................
|
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
示例代码里的这些写法看上去比较别扭。
承认偶刚才口气不对,sorry。 |
|
返回顶楼 | |
发表时间:2008-11-13
jack 写道 语法上怎么是 def class AA end 而不是 class end? 这个语法兼容吗
你是对的,def是我多敲进去的。 |
|
返回顶楼 | |
发表时间:2008-11-13
我对IronRuby最为期待的是性能提高与NativeThread....要是DLR能出CF版就更有趣了。
|
|
返回顶楼 | |
发表时间:2008-11-14
我期待如下:
1. 能有iis ISAPI接口,而不是FastCGI(既然是.net的,那就纯粹一点吧) 2. Native Thread 而不是green thread. 3. 100%兼容rubyspec。 |
|
返回顶楼 | |