gpt4 book ai didi

rest - 服务层应该接受来自 Controller 的 DTO 或自定义请求对象吗?

转载 作者:行者123 更新时间:2023-12-03 10:18:50 24 4
gpt4 key购买 nike

正如标题所示,设计服务层时的最佳实践是什么?我确实理解服务层应该始终返回一个 DTO,以便将域(实体)对象保留在服务层中。但是 Controller 的服务层输入应该是什么?

我提出以下三个我自己的建议:

方法一:
在这种方法中,域对象(Item)被保存在服务层中。

class Controller
{
@Autowired
private ItemService service;

public ItemDTO createItem(IntemDTO dto)
{
// service layer returns a DTO object and accepts a DTO object
return service.createItem(dto);
}
}

方法二:
这是服务层接收自定义请求对象的地方。我在 AWS Java SDK 和 Google Cloud Java API 中广泛看到了这种模式
class Controller
{
@Autowired
private ItemService service;

public ItemDTO createItem(CreateItemRequest request)
{
// service layer returns a DTO object and accepts a custom request object
return service.createItem(request);
}
}

方法三:
服务层接受 DTO 并返回域对象。我不喜欢这种方法。但它在我的工作场所被广泛使用。
class Controller
{
@Autowired
private ItemService service;

public ItemDTO createItem(CreateItemRequest request)
{
// service layer returns a DTO object and accepts a DTO object
Item item = service.createItem(request);
return ItemDTO.fromEntity(item);
}
}

如果上述所有 3 种方法都不正确或不是最好的方法,请告诉我最佳做法。

最佳答案

我来自 C#背景,但这里的概念保持不变。

在这种情况下,我们必须将参数/状态从应用层传递到服务层,然后从服务层返回结果,我倾向于遵循关注点分离。服务层不需要知道 Request您的应用程序层/ Controller 的参数。同样,您从服务层返回的内容不应与您从 Controller 返回的内容相耦合。这些是不同的层次、不同的要求、不同的关注点。我们应该避免紧耦合。

对于上面的例子,我会做这样的事情:

class Controller
{
@Autowired
private ItemService service;

public ItemResponse createItem(CreateItemRequest request)
{
var creatItemDto = GetDTo(request);
var itemDto = service.createItem(createItemDto);
return GetItemResponse(itemDto);
}
}

这可能感觉需要做更多的工作,因为现在您需要编写额外的代码来转换不同的对象。但是,这为您提供了极大的灵 active ,并使代码更易于维护。例如: CreateItemDtoCreateItemRequest 相比,可能有额外的/计算字段.在这种情况下,您无需在 Request 中公开这些字段。目的。你只暴露你的 Data Contract给客户,仅此而已。同样,您只将相关字段返回给客户端,而不是从服务层返回的内容。

如果要避免 Dto 之间的手动映射和 Request objects C# 有像 AutoMapper 这样的库.在java世界中,我相信应该有一个等价物。可能是 ModelMapper能够帮助。

关于rest - 服务层应该接受来自 Controller 的 DTO 或自定义请求对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com