ASP.NET MVC는 무엇을 할 수 있고 Ruby on Rails는 할 수 없습니까? [닫은]


37

ASP.NET MVC와 Rails는 비슷한 사용 영역을 가지고 있으며 동일한 아키텍처를 기반으로 구축되었으며 두 프레임 워크는 비교적 새롭고 오픈 소스입니다.

그래서 Rails 프로그래머로서 ASP.NET MVC가 할 수있는 것과 Ruby on Rails가 할 수없는 것과 비자가 무엇인지 알고 싶습니다.


좋은 질문입니다. 저는 MVC 개발자이며 이에 대한 답을 알고 싶어합니다.
StuperUser

14
이러한 유형의 질문은 개방형이며 웹 IMHO를 트롤링하여 더 나은 답변을 얻을 수 있습니다. BMW 335가 현대 쏘나타가 할 수없는 것은 무엇입니까? 두 가지 시도 모두 스티어링 휠을 사용하며 동일한 소비 프레임 워크를 기반으로합니다. 연료. 이 질문들은 더 직접적인 질문을 촉진 할 수있는 주어진 주제에 대한 이해에 대한 연구의 부족으로 인해
떠 오릅니다

1
@Aaron-이 질문에 대한 답변을 추가하는 데 어려움을 겪었지만 원칙적으로 귀하에게 동의하며, 아날로그를 빌릴 수 있도록 분명히하기를 바랍니다. 우리는 한 자동차를 다른 자동차와 비교하고 있습니다.
Adam Crossland

10
나는 개인적으로 그것이 유효한 질문이라고 생각했다. 우리 중 많은 사람들이 이야기의 한 면만 알고 다른면에 대한 아이디어를 얻는 데 도움이되기 때문에 그러한 질문은 쉽게 풀리지 않아야합니다. BTW, StackExchange에 대한 질문은 내 책에서 연구 할 자격이 있습니다.
Umar Farooq Khawaja

3
나는 이와 같은 질문을 자주하고 그것들을 격추 시켰으므로 여기서 OP에 대한 지원을 보여 드리고자합니다. 코딩시 결정은 거의 항상 주관적입니다. 내 권리는 당신의 잘못 일 수 있지만 둘 다 동등한 (주관적인) 공로의 작동 솔루션을 개발할 수 있습니다. 이 경우 OP는 두 개의 반대 기술의 상대적인 장점에 대한 의견을 원합니다. 실제로 하나를 선택하는 실제 과정을 거친 사람들의 마음을 제외하고는 어디에서나 해당 정보를 찾을 수 없습니다. 따라서 합법적 인 질문입니다.
Ian

답변:


31

Rails와 ASP.NET MVC를 모두 사용하여 실제 응용 프로그램을 개발했지만이 답변에는 상당한 경고가 있습니다. 버전 2 Rails를 통해 배우고 개발했기 때문에 완전히 최신 버전이 아닐 수 있습니다. 레일스 지식.

즉, 하나는 할 수 있지만 다른 것은 할 수 없는 것이 있다고 생각하지 않습니다 . 웹 응용 프로그램에 대한 요구 사항이 주어지면 Rails 또는 ASP.NET MVC를 사용하여 해당 응용 프로그램을 똑같이 효율적으로 빌드 할 수 있어야합니다.

ASP.NET MVC에서 주로 C # /. NET의 측면에서 사용할 수있는 몇 가지 깔끔한 사항이 있습니다. 예를 들어 제출 된 양식이 포함 된 페이지가있을 때 수행 할 작업을 결정하기 위해 GET 또는 POST를 처리하는지 확인하는 작업이 있습니다.

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

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

이것은 간단한 예이지만 if request.post?Rails 에서는 패턴이 매우 일반적입니다. 사소한 경우에는 액션 코드가 커지고 지저분해질 수 있으며 종종 별도의 메소드로 깔끔하게 리팩터링 할 수 있기를 바랍니다. ASP.NET MVC에서는 다음과 같이 할 수 있습니다.

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

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

GET 및 POST 요청 처리를 명확하게 분리 할 수 ​​있다고 생각합니다. 귀하의 마일리지가 다를 수 있습니다.

ASP.NET MVC 가하는 또 다른 것은 슈퍼 쿨 (내 의견으로는) 또한 POSTS 양식 처리와 관련이 있습니다. Rails에서는 params모든 폼 변수에 대한 해시 를 쿼리해야 합니다. 'status', 'gonkulated', 'invert'및 'disposition'필드가있는 양식이 있다고 가정 해 봅시다.

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

그러나 ASP.NET MVC를 사용하면 모든 폼 값을 매개 변수로 Action 메서드에 깔끔하게 가져올 수 있습니다.

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

이것이 제가 ASP.NET MVC 또는 Rails에 대해 정말 좋아했던 두 가지입니다. 제정신이거나 유능한 개발자가 다른 프레임 워크 중 하나를 선택해야하는 이유는 충분하지 않습니다.


6
동작 매개 변수와 관련하여 : public ActionResult Edit(Foothing foothing)ModelBinder 기능이 훨씬 더 깔끔 하다고 생각했을 것 입니다.
rmac

10
레일 예제는 구식입니다. 그들은 효과가 있지만 더 좋은 방법이 있습니다.
Jason w

2
@ 제이슨 : 이것에 대해 확장하고 요점을 게시하고 싶습니까?
Dan

3
request.post에 동의합니까? 나에게도 이상하게 보입니다 (이전 버전에서 사용 되었기 때문에). Rails 3으로 시작했고 편집 방법은 항상 'get'입니다. 게시물로 구성 할 수 있다고 가정하지만 Rails는 '업데이트'방법을 사용하여 모델에서 발생할 수있는 변경 사항에 대해 게시물을 수행하는 RESTful 패턴을 사용합니다. 따라서 올바르게 수행하면 'edit'메서드가 게시물인지 확인할 필요조차 없습니다.
PhillipKregg

3
현명한 논증을 제시하기 때문에 단순히 투표하십시오. 저는 Rails를 선호하지만 전적으로 주관적이며 귀하의 사례를 잘 주장합니다.
Steve Hill

6

Rails를 통한 ASP.NET MVC의 한 가지 장점은 기존 데이터베이스를 통해 새 응용 프로그램을 빌드해야하는 경우입니다. Rails의 ActiveRecord는 테이블이 어떻게 구성되어야하는지에 대해 매우 의견이 많으며 (테이블에는 'id'라고하는 기본 키로 하나의 정수 열만 있어야 함) 기존 테이블이 ActiveRecord 환경 설정을 준수하지 않으면 ActiveRecord를 만들기가 어렵습니다. 작업. 그러나 ActiveRecord 및 Rails를 사용하여 새로운 db로 새로운 앱을 개발하는 것은 빠릅니다!

ASP.NET MVC에는 기본 ORM이 없습니다. 필요에 맞는 데이터 액세스 전략을 선택할 수 있습니다. nhibernate와 같은 일부 ORM은 레거시 데이터베이스를 지원할 수 있습니다. guid 기본 키 등을 가질 수 있습니다.

DataMapper 라는 Rails ActiveRecord의 대안이 있지만 시도하지 않았습니다.


9
Ruby의 ActiveRecord를 사용하면 특정 규칙을 따르는 경우 많은 코드를 제거 할 수 있지만 필수는 아닙니다. 규칙을 따르지 않으면 더 분명해야합니다.
케빈 클라인

1
ASP.NET MVC에는 ORM에 대한 Entity Framework가 있는데, 지금까지 경험 한 바에 따르면 꽤 훌륭했습니다.
Cooper

멋진하여 다음 예 제대로 작성 SQL보다 20 배 느린 심하게 발생하는 쿼리를 실행 의미하는 경우) ... 단정있는 contrib은 뭔가 나는 위대한 발견 및 한 빨리 ...
niico

2

둘 다 사용하는 데, 그 대답은 IMO 응용 프로그램 요구 사항이보다 더 할 경우 ASP.NET MVC는 레일보다 더 유연하다는 것이다 단지 데이터베이스에서 읽기 / 쓰기. 내 경험상 Rails는 아주 간단한 CRUD 논리를 넘어서 어떤 종류의 복잡성이나 논리도 응용 프로그램에 도입 할 때 신속하고 무겁게 분해됩니다. ASP.NET MVC는 수행 할 수있는 작업에 대해 더 "개방적"이므로이 제한이 없습니다.

일반적인 "Web 2.0"CRUD 앱에서 다른 모든 것들은 다른 것보다 할 수있는 것이 아니라 워크 플로가 필요하거나 데이터 소스가 서로 다르거 나 다른 애플리케이션 또는 다른 것과 상호 작용할 수있는 더 복잡한 애플리케이션을위한 것입니다. 이 아닌 일반적인 CRUD는, ASP.NET은 더 많은 작업을 수행하지 레일 제한적으로 할 수있다.


9
-1 ASP.NET MVC가 더 융통성있는 것으로 여겨지는 이유는 없습니다. 주요 구성 요소, 라우팅, 컨트롤러, 렌더링을 살펴보면 레일에서 찢어지고 많은 기능이 누락 된 것입니다.
scottschulthess

1
asp.net mvc는 어떻게 더 열려 있습니까? 나는 전체 크루 드 스 캐 폴딩 일을 건너 뛸 수 있으며 모델과 컨트롤러를 처음부터 새로 만들 수 있으며 중첩 된 연결을 일대 다, 다 대일, 다 대다로 만들 수 있습니다. 그리고 자바 스크립트로 무거운 프론트 엔드를 사용하기로 결정한 경우 모든 모델 데이터를 JSON (또는 XML 또는 다른 형식)으로 클라이언트에 쉽게 전송할 수 있습니다. 또한 구현하려는 기능을 생각할 수 있다면 아마도 이미 그 보석이있을 것입니다. 사소한 Rails 앱을 찾기가 어렵지 않습니다.
PhillipKregg

2
원시 C # / .net 프레임 워크로 드롭 다운 할 수있는 것이 더 유연하다고 생각할 수 있습니까?
Chris Barry

2
이것에 대해 매우 늦었지만이 게시물에서 의미했던 것은 ASP.NET MVC를 사용하면 C # / .NET으로 떨어지고 전체 프레임 워크를 활용할 수 있습니다. 당시의 레일 (약 2.0 정도는 생각 나나요? 기억이 안나요)은 기본적으로 CRUD를 매우 쉽고 쉽게 만들었습니다. 필자가 작성했을 때 작업 한 프로젝트는 Rails (내 오류)에서 수행되었으며 "데이터베이스에서 읽고, 페이지에 표시"하는 것 이상의 논리를 수행 한 순간 C # / ASP.NET MVC ( 이 시점에서 1.0 IIRC) 대신 앱에 Rails를 선택하여 한 많은 문제가 발생하지 않았습니다.
웨인 몰리나

2

나는 Ruby on Rails와 함께 일한 적이 없으므로이 질문에 대답 할 수있는 자격이 없지만 ASP.NET MVC에 대해 내가 좋아하는 것은 형식 안전성입니다. 이것은 방해가됩니다. Adam Crossland와 rmac은 그들의 의견에 간단히 언급했지만 다음과 같은 컨트롤러 방법을 사용하면 각 매개 변수가 강력하게 입력됩니다. 이렇게하면 문자열 표현을 올바르게 입력 된 변수로 변환 할 필요가 없으므로 Edit 메서드 내의 코드가 훨씬 깔끔해집니다.

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

이 형식 안전성이 표시되는 다른 위치는 뷰 및 부분 뷰에서 부분 뷰의 뷰를 Plain Old C # 객체와 연결할 수 있으며 뷰 또는 부분 뷰의 모델로 사용됩니다. 이것은 특히 다른 뷰를 포함하는 뷰의 계층 구조를 구축하려는 경우 인생을 훨씬 쉽게 만듭니다.

Infinity.ViewModels.Site이라는 클래스가 포함 된 네임 스페이스 인 경우 ContactViewModelRazor 뷰의 경우 뷰의 맨 위에 다음과 같은 행을 배치하여 수행합니다.

@model Infinity.ViewModels.Site.ContactViewModel

ASPX 뷰의 경우 다음과 같이 뷰를 선언하여 수행합니다.

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

모델 조치의 실제 인스턴스를 Controller 조치 메소드의보기와 연관시킨 후보기의 Model특성으로 보기에서 모델 오브젝트의 인스턴스에 액세스하십시오 .

나에게있어이 강력한 유형은 매우 시원합니다. ASP.NET MVC를 만든 팀은 3 가지 모델, 뷰 및 컨트롤러 영역을 각각 강력하게 입력하기 위해 많은 노력을 기울였습니다.

Ruby-on-Rails에 이것이 있는지 확실하지 않지만, 희망합니다.


루비 언어도 강하게 타이핑됩니다 (덕 타입도 포함). 그리고 Rails는 활성 레코드를 사용하여 모델을 해당 뷰와 자동으로 연결합니다. 컨트롤러에서 선언 할 필요는 없습니다. 중첩 된 뷰 계층 구조를 만들려면 컨트롤러에 뷰에 전달할 모델을 나타내는 인스턴스 변수를 만듭니다. 예, 둘 다 같은 일을 할 수 있습니다.
PhillipKregg

1

그것들은 매우 유사하며, 대부분 "같은 일을"할 수 있습니다. 어떤 것들은 다른 것보다 쉽고 어렵습니다.

원래 릴리스에서 ASP.NET MVC를 사용했으며 분명히 Rails 클론에서 activerecord를 뺀 것입니다. 따라서 Rails는 훨씬 더 큰 기능 세트와 훨씬 더 큰 플러그인 / 젬 에코 시스템을 가지고 있습니다.


2
사실이지만 Rails는 약 8 년 동안 사용되어 왔으므로 빠르게 출발 할 수 있습니다. Rails에서 asp.net으로오고 있으며 MVC 3는 실제로 매우 훌륭합니다. Entity Framework와 NuGet 패키지 관리자는 지금까지 매우 인상적이었습니다.
PhillipKregg

1

제한된 경험에서 ASP.NET MVC의 주요 이점은 컴파일 된 언어라는 것입니다. 이를 통해 컴파일시 이미 일부 프로그래밍 버그를 감지 할 수 있습니다. 여기서 Ruby는 단위 테스트 중에 감지해야합니다.

또한 컴파일 된 사실 덕분에 한 곳에서 속성 이름을 변경하는 등 고급 리팩토링 도구를 사용할 수 있으며 속성에 대한 모든 참조가 변경됩니다. 많은 Rails 개발자들이 사용하는 TextMate에서는이 작업을 수행 할 수 없습니다.

다른 한편으로, Ruby on Rails의 주요 장점은 해석 된 언어라는 것입니다.;) 메모리의 객체를 수정하거나 클래스를 원숭이 패치하는 방법 인 Ruby의 특성은 매우 우아한 솔루션으로 이어질 수 있습니다. Eloquent Ruby 서적 에서 몇 가지 예를 확인하십시오. 그리고 많은 Rails 프레임 워크 자체가이 능력을 기반으로합니다.

언제든지 어떤 객체에서든 메소드를 대체 할 수있는 기능을 통해 단위 테스트 작성에 크게 도움이되었습니다. .NET에서 Dependency Injection 및 IOC 컨테이너는 테스트 가능한 코드를 만들기위한 사실상 요구 사항입니다. 루비에서는 필요하지 않습니다.

편집하다:

이를 고려한 후 아마도 Rails의 가장 큰 특징은 데이터베이스 마이그레이션 일 것입니다. ASP.NET MVC 프레임 워크 자체는 데이터베이스 지원을 제공하지 않습니다. .NET 프레임 워크에는 Entity Framework 및 Linq to Sql과 같은 일부 데이터 액세스 구성 요소 / ORM이 있습니다. 그러나 데이터베이스 구조를 설계하기위한 도구는 없습니다.

더 비싼 VS 버전 중 하나를 지불 하면 데이터베이스 스키마를 디자인하고 스키마를 데이터베이스에 배포하기위한 도구를 가질 수있는 Data Dude를 얻을 수 있습니다. 그러나 내가 알 수있는 한, 이전 버전의 응용 프로그램에서 마이그레이션을 처리하는 데 대한 지원은 매우 제한적입니다.

일부 사람들은 ASP.NET MVC가 데이터베이스 마이그레이션에 대한 지원 부족으로 인해 실제로 MVC 프레임 워크가 아니라 VC 프레임 워크라고 주장합니다.

편집 (다시) :

Visual Studio 툴체인 / EF를 변경하면 마지막 편집 이후 코드 기반 마이그레이션이 도입되었습니다. (그러나 해당 경로를 따라가는 경우 FluentMigrator를 확인하십시오)


2
Entity Framework 5.0 코드 우선 마이그레이션 지원
hofnarwillie

실제로 4.1 이후로 코드 첫 번째 마이그레이션이 지원되었으며 AFAIK는 편집 후 얼마 지나지 않아 릴리스되었습니다.
Pete

-1

Microsoft MVC 3 및 ​​Entity Framework의 주요 문제점은 엄청나게 나쁜 디자인 원칙입니다.

내가 처음 만난 문제 중 하나는 다른 클래스를 속성으로 사용하고 가능한 값에 대한 드롭 다운 목록을 만들려고 할 때였습니다.

내 요점을 설명하기 위해 다음과 같은 두 가지 모델 클래스가 있다고 가정하십시오.

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; }
}

Color 속성을 생성하면 실제 ORM에는 충분하지만 EF에는 충분하지 않습니다. Thing 클래스에서 Color 속성에 대한 중복 ID를 다음과 같이 추가해야합니다.

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

외부 객체 참조에 중복 ID 필드를 추가하지 않으면 연결된 클래스에서 가능한 모든 옵션을 사용하여 드롭 다운 목록을 쉽게 만들 수 없습니다.

한 클래스의 내부 작업을 다른 클래스와 강력하게 연결하기 때문에 이것은 정말 끔찍한 디자인입니다. ColorID에 대해 알아야 할 것은 없으며, Color 클래스는 ID도 노출시키지 않고 자체 동등 검사를 처리해야합니다.

이것은 모범 사례이지만, Microsoft는 컴퓨터 과학 및 객체 지향 프로그래밍의 기본 원칙을 완전히 인식하지 못하고 있습니다. [/ rant]


8
엔터티 프레임 워크 개체에 외래 키 속성이 필요하지 않습니다. 또한 EF는 완전히 별개의 제품이며 어떠한 방식으로도 ASP.NET MVC와 통합되지 않습니다. 뷰 모델을 사용하여 사용자 인터페이스를 구성하고 드롭 다운 목록 또는 기타 컨트롤을 작성해야합니다.
Lucifer Sam

동의한다. 엔터티 프레임 워크에는 ID 키가 전혀 없어야합니다. ORM은 객체 아이덴티티를 처리해야합니다. 그러나 요점은; 나는 정말로 끔찍한 EF ORM에 대해 더 불평하고 있습니다. 이 예제는 Microsoft에서 직접 제공하는 단순화 된 버전입니다. 이것이 ContosoUniversity 예제에서 정확히 수행하는 방식입니다. 이것은 내 요점을 말합니다. Microsoft는 MVC 또는 ORM을 수행하는 방법을 모릅니다.
Mike Bethany

1
ColorID 속성을 추가하면 게으른 로딩 패턴을 구현할 수있어 때때로 매우 유용합니다. 예를 들어, 참조 된 객체가 매우 커서 객체의 모든 속성 값이 필요하지 않은 경우 연결된 ID 부분 (ColorID)을 찾기 위해 모든 객체를 가져 오는 데 시간이 낭비됩니다. . 또한 Nullable / Nullable 외래 키를 구현할 수 있습니다. 즉, Color가 항상 필요하지 않은 경우 어떻게해야합니까? ColorID를 Nullable 정수로 변경int?
hofnarwillie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.