2

我正在使用ServiceStack构建一个 API 。我希望每个请求都有一个唯一的 ID,以便我可以通过系统(分布式)对其进行跟踪。

我的合同程序集包含我的 API 的 DTO,因此我认为自然的地方是让每个都Request派生自一个基类,该基类具有一个密封的受保护的无参数构造函数,该构造函数分配了一个新的 ID(可能是一个 GUID 很好)。

但是,可以通过客户端使用我的 API,而不必使用合约 DTO 程序集——如果你愿意的话,可以裸露。此时,客户可以分配他们喜欢的任何 ID(因为该属性将是一个要容纳的字符串,并且我希望 ID 分配快速)。

因此,这使我认为服务应该在请求到达系统时分配请求 ID。所以 - 我目前认为最好的办法是在每个请求 DTO 上都有一个 ID 属性,该属性被 API 验证为空 - 客户端无法设置它。然后,一个 before-everything 过滤器为 DTO 属性分配一个值。

这合乎情理吗?

有没有更优雅的方法(仍然适用于裸体客户?)?

4

1 回答 1

2

使用全局请求过滤器会起作用,您可以执行以下操作:

public class IRequiresUniqueId
{
    public Guid UniqueId { get; set; }
}

然后通过实现上述接口标记所有您希望拥有唯一 ID 的请求 DTO:

public MyRequest : IRequiresUniqueId
{
    public Guid UniqueId { get; set; }
}

然后,您可以使用全局请求过滤器来设置所有具有它们的请求 DTO:

this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
     var requiresUniqueId = requestDto as IRequiresUniqueId;
     requiresUniqueId.UniqueId = Guid.NewGuid();
});
于 2013-07-05T14:47:59.700 回答