在我的Web应用程序中,产品由N个产品选项和产品对象定义。要显示完整的产品,我需要创建一个视图模型来保存产品对象,产品选项列表以及每个产品选项的可能值列表。我的问题是什么是最佳做法?我应该在哪里构建这个对象?
在我的mvc应用程序中,我有一个服务层,我是否应该在服务层执行此操作并使用productservice.getproduct(id)之类的东西返回为视图准备好的视图模型...或者在我的控制器中我是否使用了......的组合。
Productservice.getProduct(Id) and productoptionService.getProductoptions(productId)
然后在控制器内部构建视图Model?
我的猜测是第一个选择,任何想法?
答案 0 :(得分:1)
你的问题有点复杂,因为一个开发人员对服务的意义对另一个人来说是另一回事。
那我们该如何继续?
我们知道Controller需要在View和ViewModel之间进行调解。
请记住,一个ViewModel到一个View通常是一个很好的做法。
那么您的域模型呢?
最好保持单独不允许它泄漏到您的控制器中,这是为了防止任何类型的UI特定信息意外地进入您的域模型。
我个人练习以下内容,我有一个苗条层(称之为管理员或服务),它返回一个ViewModel,并在与控制器交谈时接收ViewModel。但在与我的内部模型谈话时,我正在与我的域模型进行对话。
所以控制器 - >经理 - >服务
管理器在域模型和ViewModel之间进行映射。
例如:
public class MemberManager
{
public MemberService MemberService {get;set;}
public MemberViewModel GetMember(int id)
{
var domainModel = MemberService.GetMember(id);
return new MemberViewModel { FullName = domainModel.FullName };
}
public bool UpdateMember(MemberViewModel viewModel)
{
MemberService.Update(new MemberDomainModel { Id = viewModel.Id, FullName = viewModel.FullName });
return true; // all good.
}
}
和你的控制器。
public class MemberController
{
public MemberManager MemberManager {get;set;}
public ActionResult View(int id)
{
var viewModel = MemberManager.Get(id);
return View(viewModel);
}
}
答案 1 :(得分:0)
根据我对DDD和MVC视图模型的理解,您提到的从productservice.getproduct(id)
返回的视图模型属于域模型,视图模型仅用于
将数据传递给视图以供显示。所以在我看来,你应该有一个视图模型,它是Productservice.getProduct(Id), productoptionService.getProductoptions(productId)
的组合
你应该通过调用这两种方法在你的控制器中构建你的视图模型。