2015-08-09 51 views
1

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

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; } 
} 

在我的web应用程序中,我需要显示收藏夹列表。所以我的观点模型就是这样。

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所需的额外属性,并将其填充到业务层?

+0

我会亲自去与选项2,但它确实很主观的,依赖于其他架构 – Jedediah

+0

要么将​​工作,所以这个问题太的意见为主。如果您在视图中需要的'PersonViewModel'的唯一属性是'Title',那么我会亲自使用选项2 –

+0

我知道这是非常基于观点的问题。但是,从另一个ModelView引用ModelView的想法对我来说有点奇怪。我无法在互联网上找到明确的声明。另一方面,选项2将使我远离DRY原则。这就是为什么我想获得关于设计决策的明确声明。 –

回答

1

经过对这个话题的更多研究;

查看模型可以从不同的数据库中的企业合并值:我在这个问题 What is ViewModel in MVC? 则明确指出,发现了。

如下图所示;

因此,现在您在一个 视图模型中拥有员工和部门表中的数据。你只是这时需要以下两个 性能数据添加到您的视图模型,并填充它:

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

所以我用期权去2.

1

视图模型模式只是一个许多模式落入'Separated Presentation Pattern'桶中。

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

因此,根据你的问题

正如我有Person和FavoritePerson班我的领域类。

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

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

另外,值得一读ViewModel Best Practices