我正在使用 MVP 创建应用程序:被动视图和 EF(模型优先)。据了解,我有一个演示者直接从通过 EF 创建的 DataContext 获取数据。它看起来像这样:
private void UpdateOrderTableControl()
{
IList<Order> orders = dataContext.Orders.ToList();
IList<OrderViewModel> viewOrders = new List<OrderViewModel>();
foreach (var o in orders)
{
viewOrders.Add(new OrderViewModel()
{
OrderId = o.Id,
CustomerId = o.CustomerId,
LastName = o.Address.LastName,
FirstName = o.Address.FirstName,
Company = o.Address.Company,
Weight = o.Weight,
Sum = o.Sum,
Date = o.Date
});
}
view.GetOrderDataGridView().DataSource = viewOrders;
}
所以presenter得到一个所有订单的列表,创建一个订单视图模型列表(结合来自不同表的数据,即上面的地址),然后将视图模型列表发送到视图。
反过来,从视图中检索数据以编辑或添加到数据库时,情况几乎相同:
private void SaveOrder()
{
GetOrderDataFromView();
if (isNewOrder)
{
dataContext.Orders.Add(selectedOrder);
}
else
{
dataContext.Entry(selectedOrder).State = EntityState.Modified;
}
dataContext.SaveChanges();
isSaved = true;
UpdateOrderTableControl();
}
1) EF(通过 EF、DataContext 等创建的实体)可以被视为 DAL 吗?它应该在自己的项目中吗?
2)我猜演示者不应该像那样访问 DataContext ,而是访问两者之间的另一层,对吧?那是服务层,业务层还是两者兼而有之?
3)我所说的视图模型实际上是视图模型还是其他东西?我只是想让我的术语正确。
编辑:
4) 我阅读了一些关于向 EF 生成的实体添加业务逻辑的建议,但这对我来说听起来不太正确。我应该在 EF 之上的单独业务层中创建业务对象吗?这意味着我将拥有 Order(由 EF 生成)、OrderBO(业务对象)和 OrderViewModel(要显示的订单)。我将不得不做更多的映射,因为我会添加另一个图层,但它会使演示者更轻。
提前致谢!