日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC与RAILS3的比较

發布時間:2024/4/13 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC与RAILS3的比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進入后Web年代之后,MVC框架進入了快速演化的時代,Struts等垂垂老矣的老一代MVC框架因為開發效率低下而逐漸被拋棄,新一代的MVC則高舉敏捷的大旗,逐漸占領市場,其中的代表有Rails (ruby), .NET MVC (.NET), Django (Python),Symfony (PHP)等等,這些框架的思想都大同小異,這里列舉出Rails3和.NET MVC的一些的區別,以方便Web開發者從Rails遷移到.NET MVC,或者反之,從.NET MVC遷移到Rails.?

生成項目?
Rails和.NET MVC都能夠產生項目的基本骨架,只是生成的方式略有不同,Rails采用的是命令行的方式:?

Java代碼??
  • rails?tapir??

  • 而Microsoft則秉承其強大的IDE,提供了項目向導。?

    最終得到的目錄結構,僅在測試和配置項上略有不同。?

    RailsASP.NET MVC
    /app/models/Models
    /app/controllers/Controllers
    /app/views/Views
    /public/javascript/Scripts
    /public/Content
    /db/App_Data
    /test單獨的VS項目
    /config/Global.asax, /Properties, Web.config



    值得一提的是rails的一個亮點:rails可以預先配置三個不同的環境:開發、測試、最終產品,可以通過RAILS_ENV這個環境變量來做簡單切換,.NET MVC并未提供這樣的配置環境,你可以通過手工配置來完成。?

    模型Model?
    Rails默認采用ActiveRecord作為模型,當然切換到其他的框架也很簡單,可選項有 Neo4J, MongoDB,和DataMapper。在Rails中,還是采用命令行來創建模型,Rails會生成一些骨架代碼,包括:模型、遷移任務和測試。你可以用-o來選擇其他模型、-t來選擇其他測試框架:?

    Java代碼??
  • $?rails?g?model?customer?name:string?email:string??
  • ??????invoke??active_record??
  • ??????create????db/migrate/20100419094010_create_customers.rb??
  • ??????create????app/models/customer.rb??
  • ??????invoke????test_unit??
  • ??????create??????test/unit/customer_test.rb??
  • ??????create??????test/fixtures/customers.yml??


  • Rails默認采用Sqlite3作為后臺數據庫,而且Rails會很貼心的為開發、測試、生產三個環境分別產生一個數據庫拷貝。?

    在Rails中,所有的數據庫的操作都通過腳本和遷移來完成,Rails中的遷移應該是最有價值的一個東西,當不同的開發者同時在修改一個數據庫,或者您在升級現有的生產環境下的數據庫,遷移就顯示出它的強大威力:?

    Java代碼??
  • class?CreateCustomers?<?ActiveRecord::Migration??
  • ??
  • ??#?Called?when?migrating?up?to?this?version??
  • ??def?self.up??
  • ????create_table?:customers?do?|t|??
  • ??????t.string?:name??
  • ??????t.string?:email??
  • ??????t.timestamps??
  • ????end??
  • ??end??
  • ??
  • ??#?Called?when?migrating?down?from?this?version??
  • ??def?self.down??
  • ????drop_table?:customers??
  • ??end??
  • end??


  • 我們可以通過rake db:migrate命令遷移到不同的數據庫版本上去。?

    和Rails不同的是,.NET MVC并為綁定一個模型框架,你要從既有的框架中選擇一個適合你的,這個名單里可以用Nhibernate,Linq to SQL, Entity Framework,Castle ActiveRecord或者Ruby的ActiveRecord,不過.NET MVC沒有遷移的概念,這有點遺憾。?

    大部分情況下Linq To SQL就很適合項目開發。?

    查詢語言?
    Rails3使用AREL(Active Record Relations),LINQ-to-SQL則使用LINQ。 二者都是相當優美的語言?

    Java代碼??
  • #?A?simple?query?with?AREL??
  • User.where(users[:name].eq('Anders')).order('users.id?DESC').limit(20)??


  • Java代碼??
  • //?The?same?with?C#??
  • //?Lambda?Syntax??
  • db.Users.where(u?=>?u.Name?==?"Anders").orderBy(u?=>?u.Id).Take(20)??
  • ??
  • //?LINQ?Syntax??
  • (from?u?in?db.Users??
  • where?u.Name?==?"Anders"??
  • orderby?u.Id?descending??
  • select?u).Take(20);??


  • 現在除了在.NET中采用Ruby的ActiveRecord(借助ironruby),目前還沒有其他框架提供類似Ruby的findbyXXX的功能,不過C# 4.0的method_missing使得這類框架應該會很快出現(比如Nhibernate 3.0)?

    控制器?
    在.NET MVC中,你在Controller目錄上點添加,就有很貼心的向導引導你為項目添加控制器,甚至還可以增加基本的CRUD的功能。?

    Java代碼??
  • public?class?CustomersController?:?Controller?{??
  • ??????//?GET:?/Customers/??
  • ??????public?ActionResult?Index()?{??
  • ??????????return?View();??
  • ??????}??
  • ??
  • ??????//?GET:?/Customers/Details/5??
  • ??????public?ActionResult?Details(int?id)?{??
  • ??????????return?View();??
  • ??????}??
  • ??
  • ??????//?GET:?/Customers/Create??
  • ??????public?ActionResult?Create()?{??
  • ??????????return?View();??
  • ??????}??
  • ??
  • ??????//?POST:?/Customers/Create??
  • ??????[HttpPost]??
  • ??????public?ActionResult?Create(FormCollection?collection)?{??
  • ??????????try?{??
  • ??????????????//?TODO:?Add?insert?logic?here??
  • ??????????????return?RedirectToAction("Index");??
  • ??????????}?catch?{??
  • ??????????????return?View();??
  • ??????????}??
  • ??????}??
  • }??


  • 和Rails的腳手架代碼一樣,這些最基本的代碼99%會被廢棄,但是提供了“讓程序跑起來看看”的基礎。?

    Rails還是通過命令行來為項目增加控制器,你還可以在命令行里制定為控制器生成哪些Action。?

    過濾器?
    Rails很容易為某個Action添加個過濾器?

    Java代碼??
  • class?ItemsController?<?ApplicationController??
  • ??before_filter?:require_user_admin,?:only?=>?[?:destroy,?:update?]??
  • ??before_filter?:require_user,?:only?=>?[?:new,?:create]??
  • end??

  • .NET也不含糊,只要重載OnActionExecuting就可以實現同樣的功能:?

    Java代碼??
  • override?void?OnActionExecuting(ActionExecutingContext?filterContext)??
  • {??
  • ????var?action?=?filterContext.ActionDescriptor.ActionName;??
  • ????if?(new?List<string>{"Delete",?"Edit"}.Contains(action))?{??
  • ????????RequireUserAdmin();??
  • ????}??
  • ????if?("Create".Equals(action))?{??
  • ????????RequireUserAdmin();??
  • ????}??
  • }??

  • 或者通過.NET的attribute更漂亮的完成?

    Java代碼??
  • [RequireUserAdmin("Delete",?"Edit")]??
  • [RequireUser("Create")]??
  • public?class?CustomersController?:?Controller??


  • 路由?
    在Rails中,可以修改routes.rb來修改路由,默認的Rails的路由被配置成RESTful:?

    Java代碼??
  • Tapir::Application.routes.draw?do?|map|??
  • ??resources?:animals??
  • ??
  • ??get?"customer/index"??
  • ??get?"customer/create"??
  • ??
  • ??match?"/:year(/:month(/:day))"?=>?"info#about",??
  • ????:constraints?=>?{?:year?=>?/\d{4}/,??
  • ????????:month?=>?/\d{2}/,??
  • ????????:day?=>?/\d{2}/?}??
  • ??match?"/secret"?=>?"info#about",??
  • ????:constraints?=>?{?:user_agent?=>?/Firefox/?}??
  • end??

  • 通過rake routes你可以快速查看路由的結果。?

    ASP.NET MVC的路由稍微復雜一些,不過同樣強大:?

    Java代碼??
  • //?Global.asax.cs??
  • ?public?class?MvcApplication?:?System.Web.HttpApplication?{??
  • ????public?static?void?RegisterRoutes(RouteCollection?routes)?{??
  • ????????routes.IgnoreRoute("{resource}.axd/{*pathInfo}");???
  • ??
  • ????????//?Constrained?route??
  • ????????routes.MapRoute(?"Product",?"Product/{productId}",??
  • ????????????new?{controller="Product",?action="Details"},??
  • ????????????new?{productId?=?@"\d+"?}?);?//?Constraint??
  • ??
  • ????????//?Route?with?custom?constraint,?defined?below????
  • ????????routes.MapRoute(?"Admin",?"Admin/{action}",??
  • ????????????new?{controller="Admin"},??
  • ????????????new?{isLocal=new?LocalhostConstraint()}?);??
  • ????}??
  • ...??
  • }??
  • ??
  • public?class?LocalhostConstraint?:?IRouteConstraint?{??
  • ????public?bool?Match?(?HttpContextBase?httpContext,?Route?route,??
  • ????????string?parameterName,?RouteValueDictionary?values,??
  • ????????RouteDirection?routeDirection?)??
  • ????{??
  • ????????return?httpContext.Request.IsLocal;??
  • ????}??
  • }???


  • View?
    二者在View上的表現十分接近,添加控制器的時候,會自動創建相應的視圖,規則也類似:視圖所在的文件夾以控制器的名字命名,視圖的文件名則以控制器的action命令,二者也都提供了從某個模型創建腳手架視圖的能力。?

    Partials?
    Rails和Asp.NET MVC都提供了在文件中包含部分HTML文件能力,ASP.NET MVC的文件采用ASP,而Rails默認是ERB或HAML.?

    Java代碼??
  • <!--?Rails?-->??
  • <%=?render?'form'?%>??


  • Java代碼??
  • <!--?ASP.NET?MVC?-->??
  • <%?Html.RenderPartial("Form",?Model);%>??


  • .NET MVC 2中更做出了一些改進,提倡用2個替代的方法來產生代碼:?

    Java代碼??
  • <%=?DisplayFor("Address",?m?=>?m.Address?)?%>??
  • ??
  • <%=?EditorFor("Address",?m?=>?m.Address?)?%>??



  • 尾聲?
    這篇文章對Rails和.NET MVC作了一個快速的瀏覽,目的是讓有相應編程經驗的程序員能快速了解另一個框架。無論Rails還是.NET MVC,都只是一個工具,一個好的程序員應該能隨心擺弄他的工具,而不是被工具所擺布。?


    參考:?
    http://blog.jayway.com/2010/04/23/asp-net-mvc-vs-rails3/

    總結

    以上是生活随笔為你收集整理的ASP.NET MVC与RAILS3的比较的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。