我正在努力完全接受MVC方法提供的问题的分离,但是我已经达成了一些障碍,我很欣赏这些建议。 您如何处理/在何处放置未存储在数据库后端的字段的代码,但可以直接从中派生?
例如,我可能有一个代表Person的模型。存储的信息可能包括他们的出生日期。显然,我可以从中计算出他们当前的年龄,但不会将其存储在数据库中。现在,我希望在使用Lambda访问person对象(可能选择超过特定年龄的每个人)时将age作为一个字段。但是,如果我将代码放入模型中,我是否打破了关注点的分离?即使我把它放在那里,是否应该通过get访问字段或者创建对象时进行计算? DOB的变化怎么样?年龄应该立即反映新值,还是仅在记录被写回时?
为了便于讨论,我们假设计算需要花费大量时间来处理,因此我们希望尽量减少其使用。
我希望这个问题有道理!
答案 0 :(得分: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
属性可用于相应的视图,可以多次访问而无需重新计算。