在我的ASP.NET MVC应用程序中,我有一个相当复杂的编辑页面,它将许多模型组合到一个视图中。
我正在使用ViewModel模式来组合所有这些信息,并向View提供一个有凝聚力的对象。
例如,我的ViewModel结构是这样的:
CompanyId
CompanyName
List<Employee> Employees
List<ContactMethod> ContactMethods
Employee对象有许多基本属性和首选联系方式。
在编辑页面上,用户将获得公司的所有员工,他们可以添加和删除(使用javascript),以及编辑员工详细信息。 ContactMethods列表用于填充每位员工的下拉列表。
我已成功将我的模型(从数据库中读取)转换为此ViewModel并再次返回,因此在编辑之后,我留下了一个ViewModel,表示该公司员工的当前状态。
我正在使用Repository模式与数据库进行通信,所以我的问题是,应该直接调用CompanyRepository,传递ViewModel,还是应该在使用之前将ViewModel转换回Model对象存储库将它们写入数据库?
简而言之,应该知道我的ViewModel对象吗?
答案 0 :(得分:13)
我首先将ViewModel转换回Model对象。我喜欢尽可能地保持Web层和Repository层之间的依赖关系。
我认为您的存储库不应该知道您的ViewModel,因为这是一个Web级别的概念。
答案 1 :(得分:4)
ViewModel是视图(UI)的模型,因此存储库不应该知道视图模型。将它们分开将使存储库与UI松散耦合。
使用服务层之类的其他层来从UI封装存储库。 该层还执行ViewModel - Model对话并进行存储库调用。
public class ServiceLayer
{
public void SaveModel(ViewModel viewmodel)
{
var model = viewModel.ToModel();
repository.Save(model)
}
}
答案 2 :(得分:1)
我同意先前将ViewModels转换回“普通”模型的答案,但会补充说这项任务应该由一个单独的服务层执行。该层将负责反汇编您的ViewModel并采取适当的行动。
这基本上是服务的定义:其工作是执行需要多个模型和/或复杂逻辑的逻辑工作单元。