我的视图模型应该与洋葱架构中的核心域实体一起使用吗?

时间:2015-08-13 17:44:21

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

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

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

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

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; }
}

enter image description here

2 个答案:

答案 0 :(得分:1)

根据更新后的帖子,您基本上会询问查询方案。首先,您应该非常清楚自己正在做什么样的操作:命令(更新模型)或查询(读取模型)。每个案例都有自己的细节,可以以可维护的形式进行优化。

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

简而言之,为了查询目的,UI直接与持久性对话,滑动域。

答案 1 :(得分:0)

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

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