我有一个带有两个子项目的Web解决方案(在VS2010中):
Domain它包含Model类(通过Entity Framework映射到数据库表),Services以及(除了其他东西)负责CRUD操作
WebUI 它引用了Domain项目
对于我创建的第一个页面,我在我强类型视图中直接使用Domain项目中的Model类作为Model,因为类很小,我想显示和修改所有属性.
现在我有一个页面,它只能用于相应域模型的所有属性的一小部分.我通过在Service类中使用查询结果的投影来检索这些属性.但我需要投射到一个类型 - 这里有我能想到的解决方案的问题:
我介绍ViewModels了WebUI项目中的哪些内容IQueryables以及EF data context从服务公开到WebUI项目.然后我可以直接投射到那些ViewModels.
如果我不想公开IQueryables和EF数据上下文,我将ViewModel类放在Domain项目中,那么我可以直接返回ViewModels作为来自Service类的查询和预测的结果.
除了ViewModels在WebUI我介绍项目Data transfer objects,其来自移动查询的数据在服务类的ViewModels.
解决方案1和2看起来像是相同的工作量,我更倾向于选择解决方案2来将所有数据库问题保存在单独的项目中.但不知何故,在Domain项目中使用View -Model 听起来是错误的.
解决方案3听起来更多的工作,因为我有更多的类来创建和关心Model-DTO-ViewModel映射.我也不明白DTO和ViewModels之间会有什么区别.ViewModels不是我想要显示的Model类的所选属性的集合吗?他们不会包含与DTO相同的成员吗?为什么我要区分ViewModels和DTO?
这三种解决方案中哪一种更可取,有哪些优点和缺点?还有其他选择吗?
感谢您提前的反馈!
编辑(因为我可能有太长的文本墙并且被要求提供代码)
示例:我有一个Customer实体...
public class Customer
{
public int ID { get; set; }
public string Name { get; set; }
public City { get; …Run Code Online (Sandbox Code Playgroud)