我总是推动ViewModel的设计,考虑到特定的视图,从来没有从领域模型(=实体)的角度来看ViewModel的外观取决于你想要展示什么以及什么你想在一个视图中进行修改。
因此,你没有OrderViewModel
和CustomerViewModel
,因为您有不同的视图,这将显示或编辑订单或客户或其中的一部分。因此,您将这些ViewModel用于特定目的和视图,因此可以多次使用不同的变体。
假设你有一个OrderEditView
这种观点将允许编辑订单信息,并显示该订单的客户。您将有一个OrderEditViewModel
这样的:
public class OrderEditViewModel
{
public int OrderId { get; set; }
public DateTime? ShippingDate { get; set; }
[StringLength(500)]
public string Remark { get; set; }
//...
public OrderEditCustomerViewModel Customer { get; set; }
}
public class OrderEditCustomerViewModel
{
[ReadOnly(true)]
public string Name { get; set; }
[ReadOnly(true)]
public string City { get; set; }
// ...
}
这OrderEditCustomerViewModel
不需要的OrderEditViewModel
参考。
可以填充这个视图模型像这样:
var orderEditViewModel = context.Orders
.Where(o => o.OrderId == 5)
.Select(o => new OrderEditViewModel
{
OrderId = o.OrderId,
ShippingDate = o.ShippingDate,
Remark = o.Remark,
Customer = new OrderEditCustomerViewModel
{
Name = o.Customer.Name,
City = o.Customer.City
}
})
.SingleOrDefault();
在另一方面,如果你有一个CustomerEditView
允许编辑的客户信息,并显示在列表中的客户的订单,视图模型可能是:
public class CustomerEditViewModel
{
public int CustomerId { get; set; }
[Required, StringLength(50)]
public string Name { get; set; }
[Required, StringLength(50)]
public string City { get; set; }
//...
public IEnumerable<CustomerEditOrderViewModel> Orders { get; set; }
}
public class CustomerEditOrderViewModel
{
[ReadOnly(true)]
public DateTime? ShippingDate { get; set; }
[ReadOnly(true)]
public string Remark { get; set; }
// ...
}
这里CustomerEditOrderViewModel
不需要的CustomerEditViewModel
一个参考,你可以从数据库中创建视图模型这种方式,例如:
var customerEditViewModel = context.Customers
.Where(c => c.CustomerId == 8)
.Select(c => new CustomerEditViewModel
{
CustomerId = c.CustomerId,
Name = c.Name,
City = c.City,
Orders = c.Orders.Select(o => new CustomerEditOrderViewModel
{
ShippingDate = o.ShippingDate,
Remark = o.Remark
})
})
.SingleOrDefault();
Customer(*)ViewModel
s和Order(*)ViewModel
s是不同的 - 关于必要的参考,属性和数据注释,取决于它们在何处使用。
考虑到这些因素,OrderViewModel
和CustomerViewModel
之间的相互正确引用的问题消失了,因为您通常不需要这种视图的双向引用。
看看这是否有帮助:http://blogs.teamb.com/craigstuntz/2009/12/31/38500/ – 2012-03-27 12:41:09
抱歉不相关.. – user384080 2012-03-29 08:54:50