2017-03-05 2 views
0

MVC 방법론에서 제공하는 문제를 완전히 포용하려고 노력하고 있지만 조언을 해주는 바리케이드에 도달했습니다. DB 백엔드에 저장되어 있지 않지만 직접 파생 된 필드에 대한 코드를 어디에 처리해야합니까?MVC로 계산 된 필드

예를 들어 Person을 나타내는 모델이있을 수 있습니다. 저장된 정보에는 생년월일이 포함될 수 있습니다. 분명히, 나는 이것으로부터 그들의 현재 나이를 계산할 수 있지만 그것을 DB에 저장하지 않았을 것입니다. 이제는 람다 (Lambda)를 사용하여 사람 개체에 액세스 할 때 필드를 사용하여 나이를 처리하고 싶습니다. 하지만 코드를 모델에 넣으면 우려의 분리를 깨지 않습니까? 내가 거기에 놓을지라도 get을 통해 필드에 액세스 할 때 또는 객체를 만들 때 계산해야합니까? DOB의 변경 사항은 무엇입니까? 나이가 즉시 새로운 가치를 반영해야합니까, 아니면 기록이 다시 기록되어야합니까?

계산을 처리하는 데 상당한 시간이 걸리므로 사용을 최소화하고 싶다고 가정 해 보겠습니다.

질문이 의미가되기를 바랍니다.

+0

모델에서 읽기 전용 필드 ('get' 및 no set이있는 필드)가이 로직을 배치하기에 이상적인 장소로 보입니다. 시도해 보았 니? 오류가 있었습니까? – David

+0

예, 오류가 없습니다. 그러나 나는 얼마나 자주 다양한 람다 함수가 쿼리를하는지 모른다. 정렬을 수행 할 때마다 모든 비교에서 쿼리를 수행하면 어떨까요? 그럼, 분명히, 내 get 함수는 상당한 수의 전화 수 있습니다! 또한, 나는 그것을하는 "올바른"방법을 찾아 내려고 노력하고 있습니다 - 우려를 분리하십시오. "옳은"것이 아니라면 "더 나은"것이 있습니까? – Paul

+0

그리고 그게 무슨 문제입니까? 계산이 중요하지만 결과가 거의 변경되지 않으면 사유 변수에 결과 값을 캐시 한 다음 계산에 영향을주는 데이터 요소가 변경 될 때마다 해당 캐시를 무효화 할 수 있습니다. – David

답변

2

일부보기에서만 Age 필드가 표시되거나 필요하므로 해당보기 모델에서이 속성을 갖는 것이 좋습니다. Person 인스턴스를 가져 와서 그 나이를 계산하는 함수를 가질 수 있습니다. 그래서 컨트롤러는 다음과 같이 수 :

public ActionResult Index(int id) 
{ 
    Person person = GetFromDB(id); 
    PersonViewModel viewModel = Map(person); 
    return View(viewModel); 
} 

Map 방법 내부를 :

public PersonViewModel Map(Person person) 
{ 
    var result = new PersonViewModel(); 
    result.Age = GetAge(person.Dob); 
    ... some other fields 
    return result; 
} 

이제 Age 속성은 해당 뷰에 사용할 수 있습니다 및 재 계산하지 않고 여러 번 액세스 할 수 있습니다.