1

我正在重构一个 MVC 3 Web 应用程序,以不将数据模型直接传递给控制器​​,而是使用 View 模型(请参阅此处的灵感)。

目前,在填充模型列表时,我们在控制器中执行以下操作:

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;
        }

有没有更好的方法让我想念?

4

1 回答 1

1

知道如何提取数据并自行填充不是您的视图模型的责任,它基本上是一个 dto,带有一些额外的视图元数据(如必需等)。首先,我会让控制器调用您的数据库。然后,随着应用程序的增长,您可以稍后将 db 调用重构为存储库/数据访问层。

您还可以通过执行以下操作清理您的 linq 查询:

var entries = from t in _db.TimeEntries
              select new TimeEntryViewModel { entry = t.entry, time = t.time };

TimeEntry 也是你的数据库实体吗?如果是这样,您可以在视图模型中引用它。你也在更新你的数据库,我会使用某种依赖注入来解耦你的代码,这将清理你的代码并让你能够在单元测试中模拟它,并且稍后会设置你可以传入依赖项而不是具体的接口。

于 2013-04-09T03:00:49.927 回答