mam API REST (zbudowany w Nancy, który działa w ASP.NET), który może zwrócić obiekt JSON tak:Co jest efektywnym i niedrogim algorytmem do generowania tagów ETag?
{
id: "1",
name: "Fred",
reviews: [
{
id: "10",
content: "I love Stack Overflow"
}
]
}
zauważyć, jak ten obiekt nie jest bezpośrednim podmiotem, a nie jest to reprezentacja.
Zwykle użyłbym ostatniej modyfikacji/znacznika czasowego obiektu w DB jako ETag, a następnie, gdy zostanie zaktualizowany, ETag zostaje zaktualizowany. Prosty.
Ale w takim przypadku, co jeśli użytkownik się nie zmieni, ale zmieni się treść pierwszej recenzji? Wykorzystanie wspomnianej logiki ETag nie zmieniłoby się. Mamy tutaj przypadek, w którym reprezentacja obejmuje wiele podmiotów i próbuję znaleźć sposób, aby to jednoznacznie zidentyfikować.
Muszę więc jakoś zidentyfikować tę reprezentację (która jest prostym plikiem C# POCO przechowywanym w pamięci podręcznej Redis).
Oto moje pierwsze myśli:
Object.GetHashCode()
. Nie zadziała, ponieważ odwołanie do pamięci zawsze będzie inne.- Strumień pamięci obiektu, SHA1 hash to. Kosztowne za każdym razem.
- Zanim dodaję/zaktualizuję pamięć podręczną, utwórz identyfikator GUID, który będzie używany dla ETag i zapamiętaj go również w pamięci podręcznej. Następnie, gdy bufor podręczny zostanie przepłukany (co byłoby, w poprzednim przykładzie), generowany jest nowy identyfikator GUID, a ETag jest aktualizowany. Problem z tym podejściem polega na tym, że przywiązuję mój mechanizm ETag do mojej implementacji buforowania (więc nie luźno sprzężony).
Czy ktoś może pomyśleć o tanim/skutecznym sposobie na zrobienie tego, najlepiej na poziomie globalnym? (np. Object
lub obiekt bazowy zamiast specyficznej logiki generowania ETag dla każdej jednostki/zasobu).
Wielkie dzięki!