相关疑难解决方法(0)

MVC 3应用程序中的模型,ViewModel,DTO

我有一个带有两个子项目的Web解决方案(在VS2010中):

  1. Domain它包含Model类(通过Entity Framework映射到数据库表),Services以及(除了其他东西)负责CRUD操作

  2. WebUI 它引用了Domain项目

对于我创建的第一个页面,我在我强类型视图中直接使用Domain项目中的Model类作为Model,因为类很小,我想显示和修改所有属性.

现在我有一个页面,它只能用于相应域模型的所有属性的一小部分.我通过在Service类中使用查询结果的投影来检索这些属性.但我需要投射到一个类型 - 这里有我能想到的解决方案的问题:

  1. 我介绍ViewModelsWebUI项目中的哪些内容IQueryables以及EF data context从服务公开到WebUI项目.然后我可以直接投射到那些ViewModels.

  2. 如果我不想公开IQueryables和EF数据上下文,我将ViewModel类放在Domain项目中,那么我可以直接返回ViewModels作为来自Service类的查询和预测的结果.

  3. 除了ViewModelsWebUI我介绍项目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)

architecture asp.net asp.net-mvc asp.net-mvc-3

16
推荐指数
2
解决办法
7737
查看次数

实体框架和与MVC的关系

我试图了解整个MVC/EF关系.如果我创建一个只与数据库交互的实体模型(因为你不应该将实体模型传递给视图),那么Model的类,最后是一个视图模型,如下所示.我唯一的问题是拥有第二个类似乎是多余的,我看到的例子中唯一不同的是它们将数据注释应用于该类,因为它与视图交互.为什么确保实体对象不暴露在视图层是如此重要?

我还没有开始编写项目,但是我假设您将使用Entity模型与数据库进行交互,然后将其转换为ProductModel以传递给视图,这是正确的逻辑吗?

实体模型:

public class Product 
{
    [Key()]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

模型:

public class ProductModel
{
    public int ID { get; set; }
    [StringLength(50)]
    [Required(ErrorMessage = "Product Name is required.")]
    [Display(Name = "Product Name")]
    public string Name { get; set; }
    public string Description { get; set; }
    public double Price { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework

8
推荐指数
1
解决办法
674
查看次数