Mở rộng câu trả lời của @Hrvoje Hudo ...
Mã số:
using System;
using System.Runtime.Caching;
public class InMemoryCache : ICacheService
{
public TValue Get<TValue>(string cacheKey, int durationInMinutes, Func<TValue> getItemCallback) where TValue : class
{
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback();
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
public TValue Get<TValue, TId>(string cacheKeyFormat, TId id, int durationInMinutes, Func<TId, TValue> getItemCallback) where TValue : class
{
string cacheKey = string.Format(cacheKeyFormat, id);
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback(id);
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
}
interface ICacheService
{
TValue Get<TValue>(string cacheKey, Func<TValue> getItemCallback) where TValue : class;
TValue Get<TValue, TId>(string cacheKeyFormat, TId id, Func<TId, TValue> getItemCallback) where TValue : class;
}
Ví dụ
Bộ nhớ đệm một mục (khi mỗi mục được lưu trữ dựa trên ID của nó vì lưu vào toàn bộ danh mục cho loại mục sẽ quá chuyên sâu).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Bộ nhớ đệm tất cả mọi thứ
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Tại sao TId
Trình trợ giúp thứ hai đặc biệt tốt vì hầu hết các khóa dữ liệu không phải là tổng hợp. Các phương pháp bổ sung có thể được thêm vào nếu bạn sử dụng các phím tổng hợp thường xuyên. Theo cách này, bạn tránh thực hiện tất cả các kiểu nối chuỗi hoặc chuỗi. Định dạng để lấy khóa để chuyển đến trình trợ giúp bộ đệm. Nó cũng làm cho việc truyền phương thức truy cập dữ liệu trở nên dễ dàng hơn vì bạn không phải chuyển ID vào phương thức trình bao bọc ... toàn bộ điều này trở nên rất ngắn gọn và nhất quán cho phần lớn các trường hợp sử dụng.