【发布时间】:2018-07-26 06:28:50
【问题描述】:
我是 WebApi 和分层架构的新手。下面是我整个项目的结构:
我想知道如何将实体从控制器传递到服务,然后再从服务返回到控制器
下面是我在控制器里写的
以下是我在服务中写的
下面是 DTO 类
如何解决这些错误?
【问题讨论】:
标签: c# asp.net-core automapper asp.net-core-webapi dto
我是 WebApi 和分层架构的新手。下面是我整个项目的结构:
我想知道如何将实体从控制器传递到服务,然后再从服务返回到控制器
下面是我在控制器里写的
以下是我在服务中写的
下面是 DTO 类
如何解决这些错误?
【问题讨论】:
标签: c# asp.net-core automapper asp.net-core-webapi dto
这里有很多问题。我认为它们主要源于您的 DTO 和模型类之间的混淆。
所以这些错误都是因为您声明您的 ITodoService 使用/返回 TodoItem 实例,但您使用的是 TodoItemDto 代替:
TodoService.GetAll、TodoService.GetByid 和TodoService.Delete 在接口上都需要TodoItem,但是您在TodoService 中实现它们时使用了TodoitemDto。 (TodoService.cs 第 13 行的三个错误)。TodoService.Delete 返回值。返回的值应该是TodoItem,而不是TodoItemDto。 (TodoService.cs,第 26 行)_dorepo.Delete() 返回无效。您不能将其分配给变量。我不能帮你,因为我不知道你打算做什么。 (TodoService.cs,第 29 行)TodoService.GetAll 被错误地定义为返回TodoItemDto,所以无法返回来自_dorepo.GetAll 的值。解决方法是更改函数声明以返回TodoItem,如上面第 1 点所述。 (TodoService.cs,第 37 行)您没有显示TodoController 的代码,但我猜最后两个错误是相似的。
我的建议是执行以下操作之一:
1. 扔掉 DTO 对象。它们是个好主意,但如果它们只是为了让你感到困惑,它们就没有真正的目的,或者
2. 制作您在模型对象上实现的 DTO 接口。所有其他类和接口都尽可能仅引用这些接口。这样,您仍然可以在 API 上定义它们并根据需要使用它们,但它们不会妨碍您。而且您总是可以在需要的地方转换为模型对象。或者,
3. 在您的 DTO 上添加一个构造函数,该构造函数接受模型对象作为参数并让 DTO 包装模型对象。并在 DTO 中添加一个ToModelObject 函数,它可以让您轻松转换为模型对象。
我确实认为您应该首先关注让基本控制器按预期工作,然后才添加 DTO。这样,您一次只关注一种并发症。
【讨论】: