我们使用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字段的子集(只有名字和姓氏)。
是否更好地扩展当前端点逻辑,尝试建立端点被调用的位置并在返回之前删除不必要的字段,或者优先创建新的专用端点?也就是说,更加多余,但保持实施更简单?
答案 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) { ... }
}