2013-01-16 1 views
2

Model과 ViewModel 간의 상호 작용은 어떻게되어야합니까? Id 및 Email 속성이있는 Customer 클래스와 매우 동일한 속성이있는 CustomerModel 클래스가 있다고 가정합니다. 이보기 양식을 가지고, 내가 그 CustomerModel에 따라 뷰를로드ViewModels과 모델 간의 상호 작용은 어떻게해야합니까?

:

는 시나리오입니다. 양식이 제출되면 CustomerModel이 Action에 전달됩니다. 저장을 예로 들어 보겠습니다. 저장 작업에서 고객의 인스턴스를 만들고 속성별로 속성을 채워야합니까?

예 아래 :

ActionResult Save(CustomerModel cm) 
{ 
    //validation goes here 

    Customer c = new Customer(); 
    c.Id = cm.Id; 
    c.Email = cm.Email; 

    context.Entry<Customer>(c).State = System.Data.EntityState.Modified; 
    context.SaveChanges(); 

    //continue 
    } 

나는 목적, 데이터와 뷰 모델을 모두 사용하는 모델 클래스를 피해야한다 이전 포스트에서 읽을 감안할 때, 내가 물어

는 해당 올바른 방법인가 그것을 구현?

+0

괜찮아요. 나는 로직 (유효성 검사, 물건을 데이터베이스에 저장하는 것)을 유지 보수를위한 함수로 분리하고 Unity와 같은 의존성 삽입을 사용하지만 꽤 깨끗해 보인다. – Romoku

+0

'CustomerModel'은 뷰 모델이고'Customer'는 모델입니까? 어떤 종류의 상호 작용 * 당신이 그들 사이에 보입니까? –

+1

아마도 상호 작용은 단어의 나쁜 선택 이었지만 그 생각은 의심의 여지가 명확하지 않습니까? –

답변

1

모델과 뷰 모델 간의 상호 작용은 어떻게되어야합니까?

뷰 모델은 뷰에 데이터를 설명합니다. 이것은 프리젠 테이션 로직 및 뷰에 데이터를 제공하기위한 것입니다. 모델은 SQL 또는 파일과 같은 데이터 소스의 데이터를 설명하기위한 것입니다. 뷰 모델에서 물건

예 : 귀하의 모델

public class Customer 
{ 
    public long? Id { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public DateTime? DateOfBirth { get; set; } 
} 

나는 유지 보수를위한 기능으로 논리를 그룹화하려고 할에서 물건

public class CustomerViewModel 
{ 
    public long Id { get; set; } 
    public bool IsFoundingMember { get { return Id < 1000; } } 
    public string Name { get; set; } 
    public bool IsABaggins { get { return !string.IsNullOrWhiteSpace(Name) ? Name.EndsWith("Baggins") : false; } } 
} 

예.

말 :

ActionResult Save(CustomerModel cm) 
{ 
    if(!ValidateCustomerModel(cm)) 
    { 
     //Deal with invalid data 
    } 

    UpdateCustomer(cm); 

    //continue 
} 

public bool ValidateCustomerModel(CustomerModel model) 
{ 
    //Do stuff 
    return true; 
} 

public void UpdateCustomer(CustomerModel model) 
{ 
    Customer c = new Customer(); 
    c.Id = cm.Id; 
    c.Email = cm.Email; 

    context.Entry<Customer>(c).State = System.Data.EntityState.Modified; 
    context.SaveChanges(); 
} 

당신이 당신의 CRUD 로직을 모두 설정 한 후

당신이 그 논리에 대한 몇 가지 클래스를 만들어 단결, Ninject에, 또는 일반 오래된 생성자 주입으로 볼 수 있었다 밖으로 분리.

생성자 주입

public class MyController : Controller 
{ 
    private readonly ICustomerDL _customerDL; 
    public MyController(ICustomerDL customerDL) 
    { 
     _customerDL = customerDL; 
    } 

    //Load your implementation into the controller through the constructor 
    public MyController() : this(new CustomerDL()) {} 

    ActionResult Save(CustomerModel cm) 
    { 
     if(!ValidateCustomerModel(cm)) 
     { 
      //Deal with invalid data 
     } 

     _customerDL.UpdateCustomer(cm); 

     //continue 
    } 

    public bool ValidateCustomerModel(CustomerModel model) 
    { 
     //Do stuff 
     return true; 
    } 
} 

public interface ICustomerDL 
{ 
    void UpdateCustomer(CustomerModel model); 
} 

public class CustomerDL : ICustomerDL 
{ 
    public void UpdateCustomer(CustomerModel model) 
    { 
     Customer c = new Customer(); 
     c.Id = cm.Id; 
     c.Email = cm.Email; 

     context.Entry<Customer>(c).State = System.Data.EntityState.Modified; 
     context.SaveChanges(); 
    } 
} 

이점은 논리의 모든 깨끗하고 단위 테스트 및 코드 유지 보수 바람을 것이다 구성 될 것입니다.

+0

그건 나에게 괜찮은거야. 그러나 여기서 핵심적인 관심사는 고객의 인스턴스 생성과 속성 작성입니다. 대답을 통해 나는 올바른 길에 있다고 생각합니다. –

+0

@ user1916886 예, 모델이 데이터 소스 (SQL, 파일 등)에서 데이터를 변환하는 동안보기 모델은보기에 데이터를 설명하기위한 것입니다. 보기 모델과 모델 사이에 적절한 양의 매핑 논리가 생기게됩니다 (그리고 그 중 일부는'AutoMapper '로 볼 수 있습니다). – Romoku

+0

감사합니다. 나는 한번 볼게. –

관련 문제