我正在努力重构MVC 3网络应用程序,以便不将数据模型直接传递给控制器,而是使用View模型(参见灵感here)。
目前,在填充模型列表时,我们在控制器中执行以下操作:
var myQuery = from t in _db.TimeEntries
select t;
List<TimeEntry> timeEntryList = myQuery.ToList<TimeEntry>();
TimeEntries绑定到我们的数据库。
然而,现在我有了一个视图模型:
public class TimeEntryViewModel
{
public TimeEntry entry {get; set;}
public Time time { get; private set; }
public TimeEntryViewModel();
public TimeEntryViewModel(int ID)
{
PraxisTime.Models.PraxisTimeDB _db = new PraxisTime.Models.PraxisTimeDB();
entry = _db.TimeEntries.Find(ID);
time = _db.Times.Find(entry.TimeID);
}
}
这一切都很好,直到我想填充这些列表。这是我的解决方案,添加到视图模型中,但感觉很狡猾。
public static List<TimeEntryViewModel> LoadTimeEntryViewModels(string userID)
{
theDB _db = new theDB();
List<int> myQuery = (from t in _db.TimeEntries
select t.ID).ToList<int>();
List<TimeEntryViewModel> timeEntryList = new List<TimeEntryViewModel>();
foreach (int i in myQuery)
{
timeEntryList.Add(new TimeEntryViewModel(i));
}
return timeEntryList;
}
有没有更好的方法让我失踪?
答案 0 :(得分:1)
不是你的视图模型有责任知道如何提取数据并填充自身,它基本上是一个带有一些额外元数据的dto(如需要等)。首先,我会让控制器调用你的数据库。然后,随着应用程序的增长,您可以将db调用重构为存储库/数据访问层。
此外,您可以通过以下方式清理linq查询:
var entries = from t in _db.TimeEntries
select new TimeEntryViewModel { entry = t.entry, time = t.time };
你是db实体也是TimeEntry吗?如果是这样,您在视图模型中引用它。你也正在新建你的数据库,我会使用某种依赖注入来解耦你的代码,这将清理你的代码,并让你能够在单元测试中模拟它,并会让你在以后对你进行设置可以通过接口传递依赖性而不是混凝土。