[.NET Core] 인메모리 캐싱
Repository에서 Cache에 값이 있으면 Cache에서 값을 조회하도록 데코레이터 패턴을 사용하여 코드를 작성한다.
1. 조회 할 모델 작성
public class MyModel
{
...
}
2. Repository 인터페이스 작성
public interface IMyModelRepository
{
public MyModel GetMyModel(long id);
}
3. Repository 구현체 작성
public class MyModelRepository : IMyModelRepository
{
public MyModel GetMyModel(long id)
{
return dbSets.FromSql(..).FirstOrDefault();
}
}
4. 데코레이터 작성
public class CachedMyModelDecorator : IMyModelRepository
{
private readonly IMyModelRepository myModelRepository;
private readonly IMemoryCache cache;
private MemoryCacheEntryOptions cacheOptions;
public CachedMyModelDecorator(IMyModelRepository myModelRepository, IMemoryCache cache)
{
this.myModelRepository = mallRepository;
this.cache = cache;
cacheOptions = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromDays(1));
}
public MyModel GetMyModel(long id)
{
var value = cache.Get<MyModel>(id);
if (value == null)
{
value = myModelRepository.GetMyModel(id);
cache.Set(id, value, cacheOptions);
}
return value;
}
}
5. ASP.NET Core 서비스 등록
서비스에 캐시 사용을 등록하고 각 Repository를 등록한다.
...
services.AddMemoryCache();
services.AddScoped<MyModelRepository>();
services.AddScoped<IMyModelRepository, CachedMyModelDecorator>((provider) =>
{
return new CachedMyModelDecorator(provider.GetService<MyModelRepository>(),
provider.GetService<IMemoryCache>());
});
...