【问题标题】:Domain driven design, best practice. Where should I create my view models领域驱动设计,最佳实践。我应该在哪里创建我的视图模型
【发布时间】:2014-04-05 17:28:02
【问题描述】:

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

在我的 mvc 应用程序中,我有一个服务层,我应该在服务层中执行它并让 productservice.getproduct(id) 之类的东西返回视图模型以供视图使用...还是在我的控制器中使用结合...

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

然后在控制器内部构造视图模型?

我的猜测是第一个选项,有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    那么我们该如何继续呢?

    我们知道在 View 和 ViewModel 之间进行调解是 Controller 的责任。

    • 从请求到 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);
       } 
    }
    

    【讨论】:

    • 我不相信需要另一层抽象。是的,我有一个视图的视图模型,视图模型仅用于向用户显示产品及其所有选项,我在想如果服务返回已经构建的视图模型,它可以重用于移动站点例子?所以我确实同意你的观点,但我认为实际上并不需要会员经理位。
    • 不。考虑到这一点,您的移动网站可能在其视图模型、移动特定控件或数据上需要不同的东西?如果您从表单应用程序使用您的服务,那需要什么?或者创建一个需要 JSON 的 API?在这些情况下,现在您的服务返回了错误类型的实体,即特定于 html 的视图模型,并且需要大量重构才能使其再次保持中立,并准备好重新使用。这似乎需要更多的工作,而且确实如此,但你要保持它所做的具体、独立且只有一项职责的上下文。
    • @sheku 你的权利:-) 我想我可以调用服务来返回原始实体并在控制器中构造视图模型。现在它很有意义,但我仍然认为在我的特定场景中我不需要一个“经理”层,但我可以在其他一些地方看到这可能有用
    • 是的,你也可以这样做。 :D
    【解决方案2】:

    根据我对 DDD 和 MVC 的 view-model 的理解,你提到的从productservice.getproduct(id) 返回的那个是属于域模型的,而视图模型只是用于 将数据传递给视图以用于显示目的。所以在我看来,你应该有一个视图模型,它是Productservice.getProduct(Id), productoptionService.getProductoptions(productId) 的组合 你应该通过调用这两个方法在你的控制器中构建你的视图模型。

    【讨论】:

    • 唯一的事情是我在想,如果我在控制器中使用两者的组合来做到这一点,如果我想在应用程序的其他地方做同样的事情,我将不得不重复构建视图模型的逻辑。
    • @user2537315。在这种情况下,如果您需要在整个应用程序中使用某些东西,您可以将其设置为 1. 实用程序类中的通用方法 2.(我更喜欢)您的域模型行为的一部分
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多