กำลังขยายคำตอบของ @Hrvoje Hudo ...
รหัส:
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;
}
ตัวอย่าง
การแคชรายการเดี่ยว (เมื่อแต่ละรายการถูกแคชตาม ID เนื่องจากการแคชแคตตาล็อกทั้งหมดสำหรับประเภทรายการจะเข้มข้นเกินไป)
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
แคชบางสิ่งบางอย่าง
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
ทำไมต้อง TId
ตัวช่วยที่สองนั้นดีเป็นพิเศษเพราะคีย์ข้อมูลส่วนใหญ่ไม่ได้ประกอบกัน สามารถเพิ่มวิธีการเพิ่มเติมได้หากคุณใช้คีย์ผสมบ่อยครั้ง ด้วยวิธีนี้คุณหลีกเลี่ยงการเรียงสตริงหรือสตริงทั้งหมดจัดรูปแบบเพื่อรับคีย์เพื่อส่งผ่านไปยังแคชผู้ช่วย นอกจากนี้ยังทำให้การส่งผ่านวิธีการเข้าถึงข้อมูลง่ายขึ้นเพราะคุณไม่จำเป็นต้องส่ง ID ไปยังวิธีการห่อหุ้ม ... สิ่งทั้งหมดกลายเป็นเรื่องย่อและสอดคล้องกันมากสำหรับกรณีการใช้งานส่วนใหญ่