【问题标题】:Should my view models be with my domain entities at the core in an onion architecture?我的视图模型是否应该在洋葱架构中以我的域实体为核心?
【发布时间】:2015-11-06 19:47:30
【问题描述】:

还是应该在顶层(客户端 UI)? 当使用洋葱架构(ASP.Net MVC)时,我应该将我的视图模型与我的所有域实体放在核心。就像下图一样?

我的问题是 - 如果是,那么当我将视图模型从我的服务传递给我的客户端时,客户端(顶层)是否依赖于核心层,核心层向下两层并且不会中断每一层的整个依赖关系只与它下面的层对话?

当我有一个视图模型(在表示层中)需要引用域层(向下两层)中的实体时会发生什么,这不会破坏仅引用正下方层的洋葱架构。

public class YogaSpaceListViewModel
{
    // YogaSpaceResults is in the domain layer two layers down
    public IPagedList<YogaSpaceResults> YogaSpaces { get; set; }

    public string LocationResults { get; set; }
}


// this is in the domain layer with all my other entities
// this is being filled by entity framework in the DAL, which I'm calling from the service layer.
public class YogaSpaceResults
{
    public string Title { get; set; }
    public string Summary { get; set; }
    public DateTime Date { get; set; }
    public DbGeography LocationPoints { get; set; }
}

【问题讨论】:

  • 恕我直言,视图模型属于视图。每个 UI 都有一组不同的视图模型。有时它们可​​能类似于域模型,但域模型代表一个概念,而视图模型只是 UI 的 DTO。

标签: asp.net-mvc dependency-injection n-tier-architecture onion-architecture


【解决方案1】:

它从外到内工作,所以客户端知道服务而不是反之,服务知道域模型而不是反之亦然。

所以你是对的,如果你把你的 ViewModels 放在客户端,Services 怎么知道呢?好吧..在这种情况下,您谈论的是应用程序服务而不是域服务,因为这些服务使用普遍存在的语言为域模型服务,而 ViewModel 不应该是其中的一部分。 应用程序服务应该位于客户端和域模型之间的应用程序层中,它们可以协调其他服务和存储库之间的操作。这就是为什么我会说你的 ViewModel 应该在应用层。

【讨论】:

  • 好的,这也是我将根据您的回复和此链接stackoverflow.com/questions/15531846/… 做出的假设。但是,其中包含域实体的视图模型呢?上面粘贴的代码。现在我的应用层(顶层)需要引用向下两层的域层。这样做可以吗,还是我只能访问我正下方的图层?
  • 不,**View**(hint!!) 模型属于 UI。仅在更新模型时才有意义的应用程序层(不适用于查询),知道 可以 用作视图模型或者它可以作为视图模型的基础的操作结果,这就是控制器的工作。
  • @user1186050 您的视图模型不应包含域实体。如果是这样,要么是糟糕的设计,要么你有一个 CRUD 应用程序,然后事情就简单多了。
  • 那么根据我在这里的分层需要改变什么。我的分层看起来像这样。 UI -> 服务 ->(DAL 和实体),我已经在上面发布了我的视图模型
  • @user1186050 不要分层思考,要考虑责任和用例。谁在上面谁不重要。此外,洋葱架构需要一个依赖注入容器。
【解决方案2】:

根据更新后的帖子,您基本上是在询问查询场景。首先你应该非常清楚你在做什么类型的操作:一个命令(更新模型)或一个查询(读取模型)。每个案例都有自己的特点,并且可以以可维护的形式进行优化。

在这个特定的情况下,查询,事情很简单:控制器应该调用一个查询服务(又名查询处理程序),类似于应用程序服务,但用于查询目的,它将以所需形式从持久性中获取数据.请注意,在 DDD/CQRS 应用程序中,分层次要于垂直切片(也称为组件)。这意味着您的持久性知道您的视图模型,并且查询处理程序直接从数据库返回视图模型,不涉及域实体。

简而言之,出于查询目的,UI 直接与持久性对话,跳过域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 2012-09-24
    • 2014-12-22
    • 2022-09-24
    • 1970-01-01
    • 2020-07-26
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多