N 层 Web Api 使用自动映射器在控制器和服务层之间传递 DTO 错误
N-layered Web Api using automapper to pass DTOs between controller and service layers error
我是 WebApi 和分层架构的新手。下面是我整个项目的结构:
我想知道如何将实体从控制器传递到服务并再次从服务返回到控制器
下面是我在控制器里写的
下面是我在服务里写的
下面是 DTO class
以下是错误
如何解决这些错误?
这里有很多错误。我认为它们主要源于您的 DTO 和模型 类.
之间的混淆
所以这些错误都是因为您将 ITodoService
声明为 use/return TodoItem
实例,但您使用的是 TodoItemDto
:
TodoService.GetAll
、TodoService.GetByid
、TodoService.Delete
接口上都需要TodoItem
,但是你在[=18=实现的时候用了TodoitemDto
]. (TodoService.cs
第13行的三个错误)。
- 您根本没有 return 从
TodoService.Delete
中获取值。 returned 的值应该是 TodoItem
,而不是 TodoItemDto
。 (TodoService.cs
,第 26 行)
_dorepo.Delete()
return作废。您不能将其分配给变量。我帮不了你,因为我不知道你打算做什么。 (TodoService.cs
,第 29 行)
- 因为
TodoService.GetAll
被错误地定义为 return TodoItemDto
,_dorepo.GetAll
的值不能被 returned。解决方法是将函数声明更改为 return TodoItem
,如上文第 1 点所述。 (TodoService.cs
,第 37 行)
你没有显示 TodoController
的代码,但我猜最后两个错误是相似的。
我的建议是执行以下操作之一:
1. 丢弃 DTO 对象。它们是个好主意,但如果它们只是让您感到困惑,那么它们就没有真正的用途,或者
2. 制作您在模型对象上实现的DTO 接口。所有其他 类 和接口尽可能仅指那些接口。这样,您仍然可以在 API 上定义它们并根据需要使用它们,但它们不会妨碍您。你总是可以在需要的地方投射到模型对象。或者,
3. 在您的 DTO 上添加一个构造函数,它接受模型对象作为参数并让 DTO 包装模型对象。并在DTO中添加一个ToModelObject
函数,让你轻松转换为模型对象。
我确实认为您应该首先关注让基本控制器按预期工作,然后再添加 DTO。这样,您一次只关注一个并发症。
我是 WebApi 和分层架构的新手。下面是我整个项目的结构:
我想知道如何将实体从控制器传递到服务并再次从服务返回到控制器
下面是我在控制器里写的
下面是我在服务里写的
下面是 DTO class
以下是错误
如何解决这些错误?
这里有很多错误。我认为它们主要源于您的 DTO 和模型 类.
之间的混淆所以这些错误都是因为您将 ITodoService
声明为 use/return TodoItem
实例,但您使用的是 TodoItemDto
:
TodoService.GetAll
、TodoService.GetByid
、TodoService.Delete
接口上都需要TodoItem
,但是你在[=18=实现的时候用了TodoitemDto
]. (TodoService.cs
第13行的三个错误)。- 您根本没有 return 从
TodoService.Delete
中获取值。 returned 的值应该是TodoItem
,而不是TodoItemDto
。 (TodoService.cs
,第 26 行) _dorepo.Delete()
return作废。您不能将其分配给变量。我帮不了你,因为我不知道你打算做什么。 (TodoService.cs
,第 29 行)- 因为
TodoService.GetAll
被错误地定义为 returnTodoItemDto
,_dorepo.GetAll
的值不能被 returned。解决方法是将函数声明更改为 returnTodoItem
,如上文第 1 点所述。 (TodoService.cs
,第 37 行)
你没有显示 TodoController
的代码,但我猜最后两个错误是相似的。
我的建议是执行以下操作之一:
1. 丢弃 DTO 对象。它们是个好主意,但如果它们只是让您感到困惑,那么它们就没有真正的用途,或者
2. 制作您在模型对象上实现的DTO 接口。所有其他 类 和接口尽可能仅指那些接口。这样,您仍然可以在 API 上定义它们并根据需要使用它们,但它们不会妨碍您。你总是可以在需要的地方投射到模型对象。或者,
3. 在您的 DTO 上添加一个构造函数,它接受模型对象作为参数并让 DTO 包装模型对象。并在DTO中添加一个ToModelObject
函数,让你轻松转换为模型对象。
我确实认为您应该首先关注让基本控制器按预期工作,然后再添加 DTO。这样,您一次只关注一个并发症。