C# 洋葱架构中的DTO

C# 洋葱架构中的DTO,c#,onion-architecture,ef-core-2.1,C#,Onion Architecture,Ef Core 2.1,我的结构有点不对劲。 我有一个webapi(带有所有控制器的项目),在核心项目中有一个对iSeries层的引用(核心中的iSeries类),这里还有核心实体(域实体) 从wepapi项目中,我调用了iSeries设备,并通过域实体中的对象得到响应 现在我的问题是,服务应该返回并接受域实体(普通客户)还是DTO:s(customerForUpdate,customerForCreate) 如果我返回域实体,我会对多个服务进行多次查找,以创建我的DTO。带有clothdetails的示例客户(客户是

我的结构有点不对劲。 我有一个webapi(带有所有控制器的项目),在核心项目中有一个对iSeries层的引用(核心中的iSeries类),这里还有核心实体(域实体)

从wepapi项目中,我调用了iSeries设备,并通过域实体中的对象得到响应

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

如果我返回域实体,我会对多个服务进行多次查找,以创建我的DTO。带有clothdetails的示例客户(客户是一种服务,Cloth是另一种服务)。这使得Ef核心翻转,因为每个服务方法都在unitOfWork中调用一个save。例如,我调用clothservice获取用于客户的值,并再次更新clothservice

如果我从iSeries设备返回Dto:s,我需要将服务项目中的引用添加到Dto(在我的infra项目中)。但在这种情况下,我可以调用此项目中的其他服务并创建dto。等我完成后再打一次save


或者有没有其他方法可以在每次webapi调用时只调用save一次,或者我对dto的理解有误这种dto应该放在核心中,因为它们不是真正的dto:s?

根据onion体系结构,所有依赖项都应该在域层上,并且每个层都有自己的更高层可以通信。现在,关键是域层不应该访问域层和其他层,比如基础设施,并且只有在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

好的,我明白你的意思,据我所知,domainlayer和ui之间不应该有任何共享项目。如果我在域中有一个名为student的类。StudentService不能使用student(在公开方法中),它应该只在StudentService的公开方法中使用StudentD,明白吗?然后我知道该怎么做了,因为我已经把IServceStudent放在域或核心项目中,您建议将它放在核心/域之外的单独项目中。事实上,其中一个模式的接口层和实现层的分离称为阶梯。这样做的好处是我们实际上得到了对接口的依赖。一般来说,您应该知道应用程序层位于UI和域层之间。我们可以访问应用程序层和应用程序中的域。我们也可以访问合同,但不能访问应用程序中的域。合同层最终,UI层应仅与应用程序一起工作。合同层