Có bất kỳ thay thế/triển khai chung nào cho MemoryCache không?
Không có trong thư viện lớp cơ sở. Bạn sẽ phải cuộn của riêng bạn, mặc dù tôi, cá nhân, sẽ chỉ làm cho một wrapper xung quanh MemoryCache
cung cấp các API bạn muốn.
Điều này sẽ cung cấp loại an toàn và đem lại lợi ích hiệu suất như không boxing/unboxing
Sự an toàn loại có thể bị xử lý khá dễ dàng trong một lớp wrapper. Việc đánh boxing/unboxing sẽ chỉ là vấn đề nếu bạn đang lưu trữ các loại giá trị (không phải lớp), và thậm chí sau đó, có thể sẽ là tối thiểu, vì không chắc bạn đang đẩy và kéo bộ nhớ cache thường đủ để có được hiệu suất thực sự vấn đề.
Vì an toàn và khả năng sử dụng, tôi đã thực sự viết các phương thức của riêng mình để bao bọc các cuộc gọi của mục MemoryCache
trong phương thức chung , cho phép sử dụng tốt hơn một chút từ quan điểm API. Điều này rất dễ dàng - thường chỉ yêu cầu một phương pháp như:
public T GetItem<T>(string key) where T : class
{
return memoryCache[key] as T;
}
Tương tự, bạn có thể tạo phương pháp để đặt giá trị theo cùng một cách.
EDIT: Một điều tôi quan tâm là có loại khóa khác. Mặc định là System.String.
Điều này không được hỗ trợ trực tiếp với MemoryCache
, vì vậy nó sẽ yêu cầu một chút công bằng để tạo ra thế hệ khóa của riêng bạn. Một tùy chọn sẽ là tạo một trình bao bọc an toàn loại mà cũng cung cấp một Func<T, string>
để tạo khóa chuỗi dựa trên giá trị của bạn - điều này cho phép bạn tạo mục nhập bộ nhớ cache cho bất kỳ loại nào T
. Bạn sẽ phải cẩn thận, tất nhiên, để bao gồm tất cả dữ liệu trong chuỗi mà bạn muốn như một phần của so sánh của bạn, tuy nhiên.
Nguồn
2012-06-13 15:53:14
Nhưng bạn sẽ chỉ có thể để cache một loại? Tôi sẽ không lo lắng về chi phí này quá nhiều, phần boxing sẽ rất không đáng kể về các loại giá trị nguyên thủy. –
@AdamHouldsworth: Có, đó là dự định.Tôi đang gói bộ nhớ cache trên một bản đồ cơ sở dữ liệu với trượt hết hạn mà chỉ trả về một loại. – caesay
Đó có phải là loại giá trị không? –