洋葱架构中的Dtos

时间:2018-08-27 07:28:04

标签: c# onion-architecture ef-core-2.1

我的结构不正确。 我有一个webapi(具有所有控制器的项目),并且在核心项目(核心中的IServices类)中有我的IService层的引用,这里也是核心实体(域实体)。

从wepapi项目中,我调用了Iservices,并且得到了来自域实体的对象的响应。

现在是我的问题,服务应该返回并接受域实体(普通客户)还是DTO:s(customerForUpdate,customerForCreate)。

如果我返回Domain实体,则会针对多个服务进行多次查找以创建我的DTO。例如,有衣服细节的客户(客户是一项服务,布料是另一项服务)。这使得Ef核心可以翻转,因为每个服务方法都调用unitOfWork中的save。例如,我打电话给clothservice来获取可用于客户的价值,然后再次更新clothservice。

如果我从IServices返回Dto:s,则需要从服务项目向DTO(在我的基础项目中)添加引用。但是在这种情况下,我可以在该项目中调用其他服务并创建我的dto。然后在完成后再调用一次保存。

还是有另一种方法,每个webapi调用仅调用一次保存,或者我误解了dto,这种dto应该位于核心位置,因为它们不是真正的dto:s?

1 个答案:

答案 0 :(得分:2)

根据洋葱体系结构,所有依赖项都应在域层上,并且具有自己更高层的每一层都可以通信。现在,关键是域层完全不能访问域层和其他层(如基础结构),并且仅在Web服务层或UI中应该只能看到应用程序层,现在您的问题是要对其进行修复。将一个层与命名为(Application.Contracts)的应用程序层的应用程序层分开。在此层中,除了为该应用程序层定义的接口之外,还要在同一层上定义DTO。 然后,使用它定义要为应用程序层定义的接口,该接口仅与那些接口(DTO)配合使用,以便Web服务层或UI层没有域层。

-Application
    StudentService
    TeacherService

-Application.Contracts
          --Interfaces
              IStudentService
              ITeacherService
          --DTO
              StudentListDto
              TeacherDto
-UI Or Web service layer
 //Only can work with Application.Contracts