2013-07-05 2 views
2

Я строю API с ServiceStack. Я хочу, чтобы каждый запрос имел уникальный идентификатор, чтобы я мог проследить его через систему (которая распространяется).Каковы мои параметры в ServiceStack для назначения уникального идентификатора для каждого запроса?

У меня есть сборник контрактов, содержащий мои DTO API, и поэтому я думал, что естественным местом было бы сделать каждый из Request базовым классом, который имел закрытый защищенный конструктор без параметров, который назначил новый ID (вероятно, GUID в порядке).

Тем не менее, можно будет использовать мой API через клиентов, не обязательно используя контрактную сборку DTOs - голый, если хотите. В этот момент клиенты могут назначать любые идентификаторы, которые им нравятся (поскольку свойство будет строкой, подлежащей размещению, и я хочу, чтобы присвоение идентификатора было быстрым).

Таким образом, это заставляет меня думать, что служба должна присваивать идентификаторы запроса, когда запросы поступают в систему. Итак, я сейчас думаю, что лучше всего иметь свойство идентификатора для каждого запроса DTO, который проверяется как пустой API-интерфейсом - клиенты не могут его установить. Затем фильтр before-everything присваивает значение свойству DTO.

Разве это разумно?

Есть ли более элегантный способ сделать это (что по-прежнему работает против голых клиентов?)?

ответ

2

Использование глобального запроса фильтра будет работать, вы можете сделать что-то вроде:

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

А затем отметьте весь запрос DTOs вы хотели бы иметь уникальный идентификатор, реализовав выше интерфейс:

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

Затем вы можете использовать Global Request Filter, чтобы установить весь запрос DTOs, которые имеют их:

this.RequestFilters.Add((httpReq, httpResp, requestDto) => 
{ 
    var requiresUniqueId = requestDto as IRequiresUniqueId; 
    requiresUniqueId.UniqueId = Guid.NewGuid(); 
}); 
+0

Таким образом, эффект ily игнорируя любое значение, которое клиент мог установить на пути. Nice; благодаря :) –