复制服务堆栈端点或扩展现有端点以获得类似功能?

Duplicate servicestack endpoints or extend existing one for similar functionality?

我们使用 serviceStack 实现了不同的端点。我们经常在团队中争论是扩展现有端点还是在类似功能已经存在时创建新的 DTO 对象。

例如,为了提供通用的用户搜索功能,我们有以下 DTO User 和一个 GET 端点:

public class UserDto
{
    public long Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string NickName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public long CountryOfBirth { get; set; }
}


[Route("/Users/search", "GET")]
public class SearchUser : PagedRequest,IReturn<PagedResult<UserDto>>
{
    public string Query { get; set; }
}

GET 端点的实现在数据库中搜索与提供的查询参数和 returns 具有完整字段的分页 UserDto 结果的潜在匹配项。

让我们考虑搜索也应该从应用程序的不同区域执行,具有不同的权限并且仅显示 UserDto 字段的子集(仅名字和姓氏)。

扩展当前端点逻辑,尝试从调用端点的位置建立并在返回之前删除不必要的字段,更好吗?还是最好创建一个新的专用端点?即,冗余更多,但实现更简单?

关于是否对服务进行分组,我的指南是按 Call Semantics and Response Type 对它们进行分组,只要添加服务的新功能不会改变现有行为或改变服务的含义(例如每个属性 在搜索服务上充当过滤器)然后我希望将它们添加到现有服务上。

由于听起来您想更改新服务的响应类型,因此我将创建一个具有明确响应类型的新服务 returns。

在可能的情况下,我仍然会尽可能地考虑最大限度地重用,例如如果这个新服务只是过滤响应,我会从新服务调用现有服务并使用 custom extension method 映射结果,例如:

public class MyServices : Service
{
    public object Any(SearchUserAuthenticated request)
    {
        var response = Any(request.ConvertTo<SearchUser>());
        var userSession = base.SessionAs<AuthUserSession>();
        return new SearchUserAuthenticated {
            Results = response.Results.Map(x => x.ToDto(userSession))
        };
    }

    public object Any(SearchUser request) { ... }
}