Czy istnieje ogólna alternatywa/implementacja dla MemoryCache?
Nie w bibliotece klasy podstawowej. Musiałbyś przetasować własny, chociaż ja, osobiście, zrobiłbym opakowanie o numerze MemoryCache
, które zapewnia interfejs API, który chcesz.
byłoby to zapewnić bezpieczeństwo typu i zapewnić wzrost wydajności jak nie boks/unboxing
Bezpieczeństwo typu mogą być traktowane dość łatwo w klasie owijarki. Boxing/unboxing byłby tylko problemem, gdybyś przechowywał typy wartości (nie klasy), a nawet wtedy, byłby prawdopodobnie minimalny, ponieważ jest mało prawdopodobne, że będziesz naciskał i wyciągał z pamięci podręcznej, na tyle często, aby było to prawdziwe działanie kwestia.
chodzi o bezpieczeństwo i użyteczność typu, jakie faktycznie napisane moje własne metody zawinąć wywołuje MemoryCache
elementu w ogólnej metody, co pozwala nieco ładniejszy wykorzystania z punktu widzenia API. To bardzo proste - zazwyczaj po prostu wymaga metody takie jak:
public T GetItem<T>(string key) where T : class
{
return memoryCache[key] as T;
}
Podobnie można uczynić metodę ustawiania wartości w ten sam sposób.
EDYCJA: Kolejną rzeczą, która mnie interesuje jest posiadanie innego typu klucza. Wartością domyślną jest System.String.
Nie jest to obsługiwane bezpośrednio przez MemoryCache
, więc wykonanie własnego klucza wymagałoby sporo pracy. Jedną opcją byłoby utworzenie bezpiecznej owijki typu, która dostarczyłaby również Func<T, string>
, aby wygenerować klucz łańcucha oparty na wartości - co pozwoliłoby wygenerować wpis pamięci podręcznej dla dowolnego typu T
. Oczywiście, należy zachować ostrożność, aby uwzględnić wszystkie dane w łańcuchu, który chciałbyś dodać do swojego porównania.
Ale byłbyś w stanie tylko buforować jeden typ? Nie martwiłbym się zbytnio o ten koszt, część bokserska będzie bardzo pomijana w przypadku prymitywnych typów wartości. –
@AdamHouldsworth: Tak, to jest przeznaczone.Owijam pamięć podręczną na mapie bazy danych z wygaśnięciem po wygaśnięciu, która zwraca tylko jeden typ. – caesay
Czy jest to typ wartości? –