ASP.NET MVC có thể làm gì và Ruby on Rails không thể? [đóng cửa]


37

ASP.NET MVC và Rails có diện tích sử dụng tương tự nhau, được xây dựng xung quanh cùng một kiến ​​trúc, cả hai khung tương đối mới và nguồn mở.

Vì vậy, với tư cách là một lập trình viên Rails tôi muốn biết, ASP.NET MVC có thể làm gì và Ruby on Rails không thể, và ngược lại?


Câu hỏi tuyệt vời. Tôi là một nhà phát triển MVC và rất muốn biết câu trả lời cho điều này.
Người sử dụng Stuper

14
Các loại câu hỏi này đã kết thúc mở và được trả lời tốt hơn bằng cách truy tìm trang web IMHO. Một chiếc BMW 335 có thể làm gì mà một chiếc Hyundai Sonata không thể? Cả hai đều có 4 lần thử, vô lăng và được xây dựng trên cùng một khung tiêu thụ; nhiên liệu. Những câu hỏi này xuất hiện do thiếu nghiên cứu về sự hiểu biết về các chủ đề nhất định có thể tạo điều kiện cho một câu hỏi trực tiếp hơn .... Tôi chắc chắn nhiều người sẽ không đồng ý vì đây là lập trình viên ...
Aaron McIver

1
@Aaron - Mặc dù tôi đã gặp rắc rối khi thêm câu trả lời cho câu hỏi này, nhưng tôi đồng ý với bạn về nguyên tắc và tôi hy vọng rằng tôi đã nói rõ rằng để mượn tương tự của bạn, chúng tôi đang so sánh chiếc xe này với chiếc xe khác.
Adam Crossland

10
Cá nhân tôi nghĩ rằng đó là một câu hỏi hợp lệ. Những câu hỏi như vậy không nên bị bắn hạ dễ dàng như vậy bởi vì nhiều người trong chúng ta chỉ biết một mặt của câu chuyện và nó cũng giúp có được ý tưởng về phía bên kia. BTW, đặt câu hỏi về StackExchange đủ điều kiện là nghiên cứu trong cuốn sách của tôi.
Umar Farooq Khawaja

3
Tôi thường xuyên hỏi những câu hỏi như vậy và khiến chúng bị bắn hạ, vì vậy tôi muốn thể hiện một số hỗ trợ ở đây cho OP. Các quyết định được đưa ra khi mã hóa hầu như luôn luôn chủ quan. Quyền của tôi có thể là sai của bạn trong khi cả hai có thể phát triển các giải pháp làm việc có công bằng (chủ quan). Trong trường hợp này, OP muốn có ý kiến ​​về giá trị tương đối của hai công nghệ đối nghịch. Bạn sẽ không tìm thấy thông tin đó ở bất cứ đâu ngoại trừ trong suy nghĩ của những người đã trải qua quá trình thực tế chọn cái này qua cái khác. Do đó, đây là một câu hỏi chính đáng.
Ian

Câu trả lời:


31

Tôi đã phát triển các ứng dụng thực tế với cả Rails và ASP.NET MVC, nhưng câu trả lời này đi kèm với một cảnh báo quan trọng: Tôi đã học và phát triển với Rails phiên bản 2 trước, vì vậy tôi hoàn toàn có thể lỗi thời với tôi Rails kiến ​​thức.

Điều đó đang được nói, tôi không nghĩ rằng có bất cứ điều gì có thể được thực hiện với một nhưng không phải là khác. Đưa ra bất kỳ yêu cầu nào cho một ứng dụng web, bạn sẽ có thể xây dựng ứng dụng đó - có thể hiệu quả tương đương - với Rails hoặc ASP.NET MVC.

Có một vài điều thú vị - theo hiểu biết tốt nhất của tôi - có sẵn trong ASP.NET MVC chủ yếu là do các khía cạnh của C # /. NET. Ví dụ: khi tôi có một trang chứa biểu mẫu được gửi, tôi sẽ có một Hành động kiểm tra xem liệu nó đang xử lý GET hay POST để quyết định phải làm gì:

def edit
  @item = Item.find(params[:id])

  if request.post? 
    @item.update_attributes(params[:item])
    redirect_to :action => 'edit', :id => @item.id 
  end
end

Đây là một ví dụ tầm thường của nó, nhưng if request.post?mẫu này là một mẫu cực kỳ phổ biến trong Rails. Đối với các trường hợp không tầm thường, mã Hành động có thể trở nên lớn và lộn xộn, và thông thường, tôi ước rằng tôi có thể cấu trúc lại nó thành các phương thức riêng biệt một cách sạch sẽ. Trong ASP.NET MVC tôi có thể làm điều đó:

public ActionResult Edit() {
  // Render my page that has the Edit form
  ...
}

[HttpPost]
public ActionResult Edit(Foothing foo) {
  // Save my Foothing data
  ...
}

Tôi nghĩ rằng việc có thể phân tách rõ ràng việc xử lý các yêu cầu GET và POST là gọn gàng. Số dặm của bạn có thể thay đổi.

Một điều khác mà ASP.NET MVC thực hiện đó là siêu tuyệt vời (một lần nữa theo ý kiến ​​của tôi) cũng liên quan đến việc xử lý mẫu POSTS. Trong Rails, tôi phải truy vấn paramshàm băm cho tất cả các biến mẫu của tôi. Hãy nói rằng tôi có một biểu mẫu với các trường 'trạng thái', 'được cộng hưởng', 'đảo ngược' và 'bố trí':

def edit
  @item = Item.find(params[:id])

  if params[:status] == "new"
    ...
  else
    ...
  end

  if params[:gonkulated] == "true"
    ...
  else
    ...
  end

  if params[:invert] == "true"
    ...
  else
    ...
  end

  # Rest ommited for brevity
end

Nhưng ASP.NET MVC gọn gàng cho phép tôi lấy tất cả các giá trị biểu mẫu của mình làm tham số cho phương thức Hành động của mình:

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

Đó là hai điều mà tôi thực sự yêu thích về ASP.NET MVC hoặc Rails. Chúng không đủ lý do để bất kỳ nhà phát triển lành mạnh hoặc có thẩm quyền nào chọn một khung trên khung kia.


6
Về các tham số hành động: Tôi có thể nghĩ rằng public ActionResult Edit(Foothing foothing), tức là các tính năng ModelBinder thậm chí còn gọn gàng hơn.
rmac

10
Các ví dụ đường ray là khá lỗi thời. Họ làm việc, nhưng có nhiều cách tốt hơn để làm điều này.
Jason w

2
@Jason: bạn có quan tâm đến việc mở rộng về điều này và có thể đăng một ý chính không?
Dan

3
Tôi đồng ý rằng request.post? trông tôi cũng không bình thường (có lẽ vì nó được sử dụng trong các phiên bản cũ hơn). Tôi đã bắt đầu với Rails 3 và phương thức chỉnh sửa luôn là 'lấy'. Tôi cho rằng bạn có thể định cấu hình nó thành một bài đăng, nhưng Rails sử dụng mẫu RESTful sẽ sử dụng phương pháp 'cập nhật' để thực hiện bài đăng với bất kỳ thay đổi nào sẽ xảy ra trong một mô hình. Vì vậy, nếu được thực hiện chính xác, bạn thậm chí không cần phải kiểm tra xem phương thức 'chỉnh sửa' có phải là một bài đăng hay không.
PhillipKregg

3
Bỏ phiếu cho bạn chỉ đơn giản vì bạn trình bày một lập luận hợp lý. Tôi thích Rails, nhưng nó hoàn toàn chủ quan và bạn tranh luận trường hợp của bạn tốt.
Steve Hill

6

Một lợi thế của ASP.NET MVC so với Rails là nếu bạn cần xây dựng một ứng dụng mới qua cơ sở dữ liệu hiện có. ActiveRecord của Rails rất quan tâm về cách cấu trúc các bảng (bảng phải có một và chỉ một cột số nguyên làm khóa chính gọi là 'id', v.v.) vì vậy nếu các bảng hiện tại của bạn không tuân theo tùy chọn ActiveRecord, thật khó để tạo ActiveRecord công việc. Nhưng phát triển ứng dụng mới với db mới với ActiveRecord và Rails thì nhanh!

ASP.NET MVC không có ORM mặc định. Bạn có thể chọn một chiến lược truy cập dữ liệu phù hợp với nhu cầu của bạn. Một số ORM như nhibernate có thể hỗ trợ cơ sở dữ liệu cũ. Bạn có thể có khóa chính hướng dẫn, v.v.

Có một phiên bản thay thế cho Rails ActiveRecord được gọi là DataMapper , nhưng tôi chưa thử.


9
ActiveRecord của Ruby cho phép bạn loại bỏ rất nhiều mã nếu bạn tuân theo các quy ước nhất định, nhưng không bắt buộc. Nếu các quy ước không được tuân theo, thì bạn phải rõ ràng hơn.
kevin cline

1
ASP.NET MVC có Entity Framework cho ORM, điều này khá tuyệt vời cho đến nay theo kinh nghiệm của tôi với nó.
Cooper

Nếu tuyệt vời, bạn có nghĩa là thực thi các truy vấn được tạo ra chậm hơn 20 lần so với SQL được viết đúng thì có;) ... Dapper Contrib là thứ tôi đã tìm thấy rất nhanh và nhanh chóng ...
niico

2

Đã sử dụng cả hai, câu trả lời IMO là ASP.NET MVC linh hoạt hơn Rails nếu ứng dụng của bạn cần làm nhiều hơn là chỉ đọc / ghi từ cơ sở dữ liệu. Theo kinh nghiệm của tôi, Rails bị hỏng nhanh chóng và nặng nề ngay khi bạn giới thiệu bất kỳ loại phức tạp hoặc logic nào cho ứng dụng ngoài logic CRUD rất tầm thường. ASP.NET MVC không gặp phải hạn chế này vì nó "cởi mở" hơn về những gì bạn có thể làm.

Tất cả những thứ khác đều bằng nhau trong một ứng dụng CRUD "Web 2.0" thông thường, không có gì người ta có thể làm so với ứng dụng khác, nhưng đối với một ứng dụng phức tạp hơn cần một quy trình làm việc, hoặc phân biệt nguồn dữ liệu hoặc để tương tác với ứng dụng khác hoặc bất cứ điều gì Đó không phải là CRUD điển hình, ASP.NET có thể làm được nhiều hơn và không bị hạn chế như Rails.


9
-1 Tôi không thấy bất kỳ lý do nào khiến ASP.NET MVC được coi là linh hoạt hơn - nếu bạn nhìn vào các thành phần chính, định tuyến, bộ điều khiển, kết xuất, tất cả chúng chỉ bị xé toạc và thiếu rất nhiều tính năng.
scottschulthess

1
Làm thế nào là asp.net mvc 'cởi mở hơn'? Tôi có thể bỏ qua toàn bộ điều giàn giáo thô sơ, và làm cho các mô hình và bộ điều khiển của tôi từ đầu cộng với việc tạo ra các hiệp hội lồng nhau - từ một đến nhiều, nhiều đến một, nhiều đến nhiều - mà không bị 'hỏng'. Và, nếu tôi quyết định sử dụng một giao diện nặng javascript, tôi có thể dễ dàng gửi tất cả dữ liệu mô hình của mình đến máy khách bằng JSON (hoặc XML hoặc bất kỳ định dạng nào khác). Ngoài ra, nếu bạn có thể nghĩ về một chức năng mà bạn muốn thực hiện, thì có lẽ đã có một viên ngọc cho điều đó. Không khó để tìm thấy các ứng dụng Rails không tầm thường.
PhillipKregg

2
Có thể thả xuống khung c # / .net thô có thể được coi là linh hoạt hơn không?
Chris Barry

2
Rất muộn về điều này, nhưng điều tôi có ý nghĩa với bài đăng này là ASP.NET MVC cho phép bạn thả xuống C # /. NET và tận dụng toàn bộ khung. Rails tại thời điểm đó (khoảng 2.0 tôi nghĩ? Tôi không thể nhớ) về cơ bản làm cho CRUD trở nên rất dễ dàng và mọi thứ khác đều khó khăn; dự án tôi đang thực hiện khi tôi viết nó đã được thực hiện trong Rails (lỗi của tôi) và đã phá vỡ phút chúng tôi đang thực hiện logic ngoài "đọc từ cơ sở dữ liệu, hiển thị trong trang", tôi đã thực hiện nó trong C # / ASP.NET MVC ( 1.0 tại thời điểm này IIRC) Tôi sẽ không gặp phải nhiều vấn đề mà tôi đã làm bằng cách chọn Rails cho ứng dụng thay thế.
Wayne Molina

2

Tôi chưa bao giờ làm việc với Ruby on Rails, vì vậy tôi không đủ điều kiện để trả lời câu hỏi này, nhưng một điều tôi thích về ASP.NET MVC vô cùng là sự an toàn kiểu. Điều này đến trong cách. Adam Crossland và rmac đã chạm vào nó một cách ngắn gọn trong các bình luận của họ, nhưng tôi muốn chỉ ra rằng với một phương thức điều khiển như sau, mỗi tham số sẽ được gõ mạnh. Điều này làm cho mã trong phương thức Chỉnh sửa sạch hơn rất nhiều ở chỗ bạn không phải lo lắng về việc chuyển đổi các biểu diễn chuỗi thành các biến được nhập đúng.

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

Một vị trí khác mà loại an toàn này hiển thị là trong Chế độ xem và Chế độ xem một phần trong đó người ta có thể liên kết chế độ xem một phần với đối tượng C # cũ, sẽ đóng vai trò là mô hình của Chế độ xem hoặc Chế độ xem một phần. Điều này làm cho cuộc sống dễ dàng hơn nhiều, đặc biệt là nơi bạn muốn xây dựng một hệ thống phân cấp các chế độ xem có chứa các chế độ xem khác.

Nếu Infinity.ViewModels.Sitelà không gian tên chứa một lớp được gọi ContactViewModel, thì đối với các khung nhìn của Dao cạo, bạn làm điều đó bằng cách đặt một dòng như thế này ở trên cùng của khung nhìn:

@model Infinity.ViewModels.Site.ContactViewModel

và đối với các chế độ xem ASPX, bạn thực hiện bằng cách khai báo chế độ xem theo cách này:

<%@ Page Language="C#" ="~/Views/Shared/Site.master" ="System.Web.Mvc.ViewPage<Infinity.ViewModels.Site.ContactViewModel>" %>

Bạn liên kết thể hiện thực của đối tượng mô hình với khung nhìn trong phương thức hành động của Trình điều khiển và sau đó truy cập vào thể hiện của đối tượng mô hình trong khung nhìn theo thuộc Modeltính của khung nhìn.

Đối với tôi, kiểu đánh máy mạnh mẽ này là siêu tuyệt vời. Nhóm đã tạo ra ASP.NET MVC đã dành rất nhiều nỗ lực để làm cho mỗi trong số 3 khu vực Mô hình, Chế độ xem và Trình điều khiển được gõ mạnh.

Tôi không chắc liệu Ruby-on-Rails có thứ này không, nhưng tôi sẽ hy vọng như vậy.


Ngôn ngữ Ruby cũng được gõ mạnh (cũng được gõ vịt). Và Rails sử dụng bản ghi hoạt động để tự động liên kết các mô hình của nó với các khung nhìn của nó. Bạn sẽ không cần khai báo chúng trong bộ điều khiển. Nếu bạn muốn tạo một hệ thống phân cấp các khung nhìn lồng nhau, bạn sẽ tạo một biến thể hiện trong bộ điều khiển đại diện cho các mô hình mà bạn muốn được chuyển đến dạng xem. Vì vậy, có, cả hai có thể làm điều tương tự.
PhillipKregg

1

Chúng rất giống nhau và hầu hết đều có thể "làm những việc giống nhau", chỉ một số thứ dễ hơn trong một và khó hơn những thứ khác.

Tôi đã sử dụng ASP.NET MVC xung quanh bản phát hành gốc và nó chắc chắn là một bản sao Rails trừ Activerecord. Vì vậy, Rails gần như chắc chắn có một bộ tính năng lớn hơn nhiều và hệ sinh thái plugin / đá quý lớn hơn nhiều.


2
Đúng - nhưng Rails cũng đã được khoảng 8 năm nên nó có một khởi đầu. Tôi đang đến từ Rails đến asp.net và MVC 3 thực sự rất hay. Entity Framework và trình quản lý gói NuGet rất ấn tượng với tôi cho đến nay.
PhillipKregg

1

Theo kinh nghiệm hạn chế của tôi, lợi thế chính của ASP.NET MVC là nó là một ngôn ngữ được biên dịch. Điều này cho phép bạn phát hiện một số lỗi lập trình đã có trong quá trình biên dịch, trong đó Ruby phải dựa vào việc phát hiện sau đó trong quá trình kiểm tra đơn vị.

Ngoài ra, thực tế là nó được biên dịch cho phép có các công cụ tái cấu trúc nâng cao, ví dụ thay đổi tên của một thuộc tính ở một nơi và tất cả các tham chiếu đến thuộc tính được thay đổi. Điều này ít nhất không thể được thực hiện trong TextMate, mà nhiều nhà phát triển Rails sử dụng.

Mặt khác, ưu điểm chính của Ruby on Rails là nó là ngôn ngữ được dịch;) Bản chất của Ruby, làm thế nào bạn có thể sửa đổi bất kỳ đối tượng nào trong bộ nhớ hoặc khỉ vá một lớp, có thể dẫn đến một số giải pháp rất thanh lịch; kiểm tra cuốn sách Eloquent Ruby để biết một số ví dụ. Và rất nhiều khung Rails tự nó dựa trên khả năng này.

Khả năng thay thế bất kỳ phương pháp nào tại bất kỳ đối tượng nào vào bất kỳ lúc nào cũng giúp tôi rất nhiều trong việc viết bài kiểm tra đơn vị. Trong .NET, các thùng chứa Dependency Injection và IOC hầu như là các yêu cầu để tạo mã có thể kiểm tra. Điều đó là không cần thiết trong Ruby.

Chỉnh sửa:

Sau khi suy nghĩ về nó, có lẽ tính năng sát thủ của Rails là di chuyển cơ sở dữ liệu. Khung ASP.NET MVC tự nó không cung cấp bất kỳ hỗ trợ cơ sở dữ liệu nào. .NET framework có một số thành phần truy cập dữ liệu / ORM, ví dụ Entity Framework và Linq to Sql. Nhưng nó không có bất kỳ công cụ nào để thiết kế cấu trúc cơ sở dữ liệu.

Nếu bạn trả tiền cho một trong những phiên bản đắt hơn của VS, bạn có thể lấy Data Dude , cho phép bạn thiết kế lược đồ cơ sở dữ liệu và có một số công cụ để triển khai lược đồ vào cơ sở dữ liệu. Nhưng theo như tôi có thể nói, hỗ trợ xử lý việc di chuyển từ các phiên bản trước của ứng dụng là rất hạn chế.

Một số người cho rằng ASP.NET MVC không thực sự là khung MVC, chỉ đơn thuần là khung VC, do thiếu hỗ trợ cho việc di chuyển cơ sở dữ liệu.

Chỉnh sửa (một lần nữa):

Các thay đổi đối với công cụ Visual Studio / EF đã giới thiệu các lần di chuyển dựa trên mã kể từ lần chỉnh sửa cuối cùng của tôi. (nhưng cũng kiểm tra FluentMigrator nếu bạn đang đi xuống con đường đó)


2
Mã khung thực thể 5.0 Hỗ trợ đầu tiên Di chuyển
hofnarwillie

Trên thực tế, mã di chuyển đầu tiên đã được hỗ trợ kể từ 4.1, được AFAIK phát hành không quá lâu sau khi chỉnh sửa của tôi.
Pete

-1

Vấn đề lớn của tôi với Microsoft MVC 3 và Entity Framework là các nguyên tắc thiết kế tồi tệ đáng kinh ngạc của họ.

Một trong những vấn đề đầu tiên tôi gặp phải là khi sử dụng một lớp khác làm tài sản và cố gắng tạo một danh sách thả xuống cho các giá trị có thể.

Để minh họa quan điểm của tôi nói rằng bạn có hai lớp mô hình như thế này:

public class Color
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual Color Color { get; set; }
}

Tạo thuộc tính Màu sẽ đủ cho ORM thực chứ không phải EF. Bạn phải thêm ID dự phòng cho thuộc tính Color trong lớp Thing như vậy:

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ColorID { get; set; }
    public virtual Color Color { get; set; }
}

Nếu bạn không thêm trường ID dự phòng cho tham chiếu đối tượng nước ngoài, bạn không thể dễ dàng tạo danh sách thả xuống với tất cả các tùy chọn có thể từ lớp được liên kết.

Đây thực sự là một thiết kế khủng khiếp vì nó kết hợp mạnh mẽ các hoạt động nội bộ của lớp này với lớp khác. Không nên biết gì về ColorID, lớp Color sẽ xử lý các kiểm tra tính bằng của chính nó mà không để lộ rằng nó thậm chí còn có ID.

Đây là cách thực hành tốt nhất 101 công cụ nhưng rõ ràng Microsoft hoàn toàn không biết về các nguyên tắc cơ bản của khoa học máy tính và lập trình hướng đối tượng. [/ Rant]


8
Bạn không cần một thuộc tính khóa ngoại trên các đối tượng khung thực thể của bạn. Ngoài ra, EF là một sản phẩm hoàn toàn riêng biệt và không được tích hợp với ASP.NET MVC dưới bất kỳ hình thức nào. Bạn nên sử dụng các mô hình xem để xây dựng giao diện người dùng của mình và xây dựng bất kỳ danh sách thả xuống hoặc các điều khiển khác.
Lucifer Sam

Tôi đồng ý. Bạn hoàn toàn không nên có bất kỳ khóa ID nào trong khung thực thể của mình. Một ORM nên xử lý danh tính đối tượng. Nhưng điểm lấy; Tôi thực sự phàn nàn nhiều hơn về EF ORM khủng khiếp. Ví dụ, đó là một phiên bản đơn giản hóa đến trực tiếp từ Microsoft. Đó chính xác là cách họ làm điều đó trong ví dụ ContosoUniversity của họ. Điều này không nói lên quan điểm của tôi. Microsoft không biết làm MVC hay ORM và các ví dụ của họ cho thấy điều đó.
Mike Bethany

1
Thêm thuộc tính ColorID cho phép bạn triển khai các mẫu tải lười biếng rất hữu ích. Ví dụ: nếu đối tượng được tham chiếu rất lớn và bạn không thực sự cần tất cả các giá trị thuộc tính của đối tượng, thì sẽ rất lãng phí thời gian xử lý để tìm nạp tất cả chỉ để tìm phần ID được liên kết của nó (ColorID) . Nó cũng cho phép bạn thực hiện các khóa ngoại không Nullable / Non-Nullable, tức là nếu màu không luôn luôn cần thiết thì sao? Thay đổi ColorID thành Số nguyên không thể thay đổiint?
hofnarwillie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.