ViewModel结构决策

时间:2015-08-09 02:27:03

标签: c# asp.net-mvc model-view-controller

作为我的域类,我有Person和FavoritePerson类,如下所示。

public class CompanyPerson : ICompanyPerson
{
    [Key]
    public Guid PersonId { get; set; }      
    public string Title { get; set; }
    public string Description { get; set; }
}

public class CompanyFavoritePerson : IFavoritePerson
{
    [Key]
    public Guid FavoritePersonId { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime CreateDate { get; set; }

    public Guid? CompanyPerson_PersonId { get; set; }

    [StringLength(128)]
    public string CompanyUser_UserId { get; set; }

    public virtual CompanyPerson CompanyPerson { get; set; }

    public virtual CompanyUser CompanyUser { get; set; }
}

在我的网络应用程序中,我需要显示收藏人员列表。所以我的视图模型是这样的;

public class FavoritePersonViewModel 
{
    public Guid FavoritePersonId { get; set; }
    public DateTime CreateDate { get; set; }
    public Guid? CompanyPerson_PersonId { get; set; }
    public string CompanyUser_UserId { get; set; }
    //Option1: PersonViewModel PersonViewModel {get; set; }
    //Option2: public string Title {get;set;}
}

因为我需要在列表中显示最喜欢的用户的标题(标题属于Person类)哪种方式与最佳实践相匹配?

从另一个viewModel引用viewModel或使用所需的额外属性扩展viewModel并将它们填入业务层?

2 个答案:

答案 0 :(得分:1)

经过对此主题的更多研究;我发现了这个问题 What is ViewModel in MVC? 明确指出:

  

视图模型可以组合来自不同数据库实体的值。

如下所示;

  

现在,您将Employees和Departments表中的数据合二为一   查看模型。然后,您将需要添加以下两个   属性到视图模型并用数据填充它:

public int DepartmentId { get; set; }
public IEnumerable<Department> Departments { get; set; }

所以我选择了选项2.

答案 1 :(得分:1)

ViewModel模式只是属于“Separated Presentation Pattern”存储桶的众多模式之一。

在设计ViewModel之前,考虑视图的要求非常重要。例如,如果视图中有两个小部件,并且每个小部件都有自己的ViewModel,则复合ViewModel适用于这种情况,但如果视图只是一个使用多个域类的视图,那么是否每个小组都有View模型,复合ViewModel不合适,因为它增加了复杂性,一个ViewModel中的每个更改都可能破坏您的代码。

因此,根据您的问题

  

作为我的域类,我有Person和FavoritePerson类。

     

因为我需要在列表中显示最喜欢的用户的标题(标题属于Person类)。

在我看来,复合ViewModel不是一个好选择,你应该设计一个新的ViewModel。

还值得阅读ViewModel Best Practices