重复的服务堆栈端点或扩展现有端点以实现类似功能?

时间:2015-07-02 19:34:55

标签: web-services servicestack dto

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

例如,为了提供通用的用户搜索功能,我们有以下DTO 用户和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端点的实现在数据库中搜索与提供的查询参数的潜在匹配,并返回带有完整字段的分页UserDto结果。

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

是否更好地扩展当前端点逻辑,尝试建立端点被调用的位置并在返回之前删除不必要的字段,或者优先创建新的专用端点?也就是说,更加多余,但保持实施更简单?

1 个答案:

答案 0 :(得分:3)

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

由于您似乎想要更改新服务的响应类型,因此我将使用显式响应类型创建一个新服务。

在可能的情况下,我仍然会考虑在可能的情况下最大限度地重复使用,例如:如果这个新服务刚刚过滤了响应,我将从新服务调用现有服务,并使用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) { ... }
}