域驱动设计,最佳实践。我应该在哪里创建我的视图模型

时间:2014-03-04 09:18:25

标签: c# asp.net asp.net-mvc architecture domain-driven-design

在我的Web应用程序中,产品由N个产品选项和产品对象定义。要显示完整的产品,我需要创建一个视图模型来保存产品对象,产品选项列表以及每个产品选项的可能值列表。我的问题是什么是最佳做法?我应该在哪里构建这个对象?

在我的mvc应用程序中,我有一个服务层,我是否应该在服务层执行此操作并使用productservice.getproduct(id)之类的东西返回为视图准备好的视图模型...或者在我的控制器中我是否使用了......的组合。

Productservice.getProduct(Id) and productoptionService.getProductoptions(productId)

然后在控制器内部构建视图Model?

我的猜测是第一个选择,任何想法?

2 个答案:

答案 0 :(得分:1)

你的问题有点复杂,因为一个开发人员对服务的意义对另一个人来说是另一回事。

那我们该如何继续?

我们知道Controller需要在View和ViewModel之间进行调解。

  • 从请求映射到ViewModel
  • 选择合适的视图
  • 将ViewModel交付给View

请记住,一个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)的组合 你应该通过调用这两种方法在你的控制器中构建你的视图模型。