1

저는 ASP.NET MVC를 처음 접했고 PHP MVC 배경에서 왔습니다. 어색한 전환이었습니다. (내 질문의 역사, ㅎ을 참조하십시오.)모델이 지속성에 영향을받지 않는 경우 어떻게 저장합니까?

.Net 세상에서 큰 이론을 좋아하는 한 가지는 지속성에 의존하지 않는 모델이라는 아이디어입니다. 그러나이 경우 모델에 변경 사항을 저장하는 적절한 방법은 무엇입니까? PHP에서는 변환을 수행 한 후에 $model->save();이라고 부릅니다. C#에서는 그렇게하는 방법이 확실하지 않습니다.

적절합니까?

public class AwesomesauceController 
{ 
    //inject! 
    public AwesomeSauceController(IDataAccess da) 
    { 
     DataAccess = da;  
    } 
    private readonly IDataAccess DataAccess; 

    [HttpGet] 
    public ActionResult Edit(int Id) 
    { 
     // PHP equiv: AwesomeSauceModel::find($id); Controller is unaware of DAL 
     return View(DataAccess.AwesomeSauces.Where(sc => sc.Id == Id).FirstOrDefault()); 
    } 

    [HttpPost] 
    public ActionResult Edit(AwesomeSauce sc) 
    { 
     //persistence-aware version: model is aware of DAL, but controller is not 
     if($sc->valid() 
      $sc->save(); 
      redirect(); 
     } 
     else { return view(); } 

     // compare to persistence-agnostic version, controller is aware of DAL, but model is not 
     if(ModelState.IsValid) 
     { 
      da.Persist(sc); 
      return Redirect(); 
     } 
     else 
     { 
      return View(sc); 
     } 
    } 
} 

나는 일반적으로 내가 컨트롤러가 직접이 방법으로 데이터 액세스 레이어에 접근하고 싶지 않은 것입니다 이것에 대해 저와 같은 잘못된 파업 유일한 것 같아요. 이전에는 PHP 환경에서 컨트롤러가 기본적으로 모델과 뷰에만 액세스했습니다.

+0

'$ model-> save(); '에서 [active record pattern] (http://martinfowler.com/eaaCatalog/activeRecord.html)에 익숙하다고 추론합니다. 이를 [저장소 패턴] (http://martinfowler.com/eaaCatalog/repository.html)과 비교하십시오. 물론 PHP 컨트롤러는 모델과 뷰만 액세스하지만 [활성 레코드] [1]에서 보듯이 모델에는 데이터 액세스 논리가 있습니다 (즉 save() 메소드입니다). –

답변

2

무엇을하고 있습니까? ActiveRecord vs Repository vs Home Brew DAL은 영원히 논의 할 영원한 질문입니다.

repository pattern은 현재 .NET 세상에서 매우 인기가 있으며 아마도 그 사용법에 대한 많은 예제를 보게 될 것입니다. MVC는 데이터 액세스 전략이 무엇인지 신경 쓰지 않습니다. 당신이 편하다고 느낀 것을 사용하는 것은 다른 사람들이하고 있기 때문에 패턴을 사용하는 것보다 낫고 훌륭한 전략입니다.

1

모델에 Save() 함수가 있어도 문제가 없지만 Save() 비헤이비어를 모델에 독립적으로 (즉, 인터페이스에 추상화하려는 경우) 사용하는 것이 좋습니다.

디자인 원칙을 기억하십시오. 구현이 아니라 인터페이스로 디자인하십시오.

다른주의 사항은 개별적으로 개별적으로 테스트하는 방법입니다. 모델이 지속성을 모르는 경우 모델 으로 테스트하고 지속성 메커니즘을 으로 테스트 할 수 있습니다.

Create() 액션이 두 가지 작업을하는 것처럼 보입니다. 모델을 사용하여 저장하고 DataAccess를 사용하려고 시도하는 것처럼 보입니다. 이 두 객체가 같은 것을하고 있습니까? 나중에 혼란 스럽거나 읽을 수 없거나 유지하기 어려울 수 있습니까?

+0

create 액션 (실제로'Edit'라고 부름)은 비교를 위해 persistence-agnostic 버전 (후자)과 persistence-aware 버전 (이전)을 모두 가지고 있습니다. - 나는 원래 질문에서 이것을 분명히하려고 노력했다. – notJim

관련 문제