シンプルな注文サービスがあり、キャッシュを実装したいと考えています。これが私のリクエスト/レスポンスとサービスです:
[Route("/order", "GET")]
[Route("/order/{Id}", "GET")]
public class OrderRequest : IReturn<OrderResponse>
{
public int Id { get; set; }
public string Reference1 { get; set; }
public string Reference2 { get; set; }
public DateRange CreatedOn { get; set; }
public DateRange ProcessedOn { get; set; }
public DateRange ShippedOn { get; set; }
public DateRange ModifiedOn { get; set; }
}
public class OrderResponse : IHasResponseStatus
{
public ResponseStatus ResponseStatus { get; set; }
public List<Order> Orders { get; set; }
}
public class OrdersService : Service
{
public object Get(OrderRequest request)
{
var cacheKey = UrnId.Create<OrderResponse>(request.Id.ToString());
return base.RequestContext.ToOptimizedResultUsingCache(base.Cache, cacheKey, new TimeSpan(0,5,0), () =>
{
return GetOrders(request);
});
}
public OrderResponse GetOrders(OrderRequest request)
{
..
}
}
ドキュメントを見ると、キャッシュされたアイテムごとに一意のキーが生成されます。例では、これは通常、応答オブジェクト + アイテム ID です。ただし、さまざまなタイプのリクエストをキャッシュしたいと思います。たとえば、リクエストで日付範囲を指定できます。同じ日付範囲で同じリクエストを行うと、キャッシュされたコピーを受け取りたいと思います。私の質問は、一部またはすべてのリクエスト パラメータに基づいて一意の ID を生成する最良の方法は何ですか? おそらく、リクエスト DTO で GetHashCode を使用またはオーバーライドしますか? 次に、キャッシュに同じタイプ (OrderResponse など) のオブジェクトが多数含まれている場合、特定のタイプのアイテムをすべて削除できますか? そうしないと、注文を変更すると、キャッシュされたオブジェクトのどれを削除すればよいかわかりません。