由于ASP.NET Core提供的MemoryCache可以注入并且是单身,它应该注入Controller还是Service?MVC 6的MemoryCache应该用于控制器级还是服务级?
我有调用服务从数据库或外部服务获取信息的控制器。在控制器中,我只会将一些信息(对象列表转换为List<SelectListItem>
)。
我应该在服务级别缓存并将缓存的信息返回给控制器,还是应缓存已转换的信息(List<SelectListItem>
甚至服务原始信息)?
由于ASP.NET Core提供的MemoryCache可以注入并且是单身,它应该注入Controller还是Service?MVC 6的MemoryCache应该用于控制器级还是服务级?
我有调用服务从数据库或外部服务获取信息的控制器。在控制器中,我只会将一些信息(对象列表转换为List<SelectListItem>
)。
我应该在服务级别缓存并将缓存的信息返回给控制器,还是应缓存已转换的信息(List<SelectListItem>
甚至服务原始信息)?
服务负责更昂贵的操作(从数据库或一些这样获得的数据)。与此相比,你在控制器执行转换有一个可以忽略不计的性能影响,所以把这个责任到控制器不会从性能的角度帮助。
此外,它有可能是相同的服务方法可以从多个地方,在这种情况下,你会得到更多的受益于高速缓存在服务层被调用。
从的角度来看“关注点分离”,另一种策略可以使用,这我已经成功用,是移动缓存责任融入到自己的类。
public interface IThingRepository
{
IReadOnlyCollection<Thing> GetThings();
}
public class ThingRepository : IThingRepository
{
//...
}
public class ThingRepositoryCache : IThingRepository
{
IThingRepository realRepository;
MemoryCache cache;
public ThingRepositoryCache(IThingRepository realRepository,
MemoryCache cache)
{
this.realRepository = realRepository;
this.cache = cache;
}
public IReadOnlyCollection<Thing> GetThings()
{
return cache["things"] ?? cache["things"] = this.realRepository.GetThings();
}
}
与二结合这样的事情,注入真实的版本库到缓存中,每当有人问存储库:
Bind<IThingRepository>().ToMethod(c => new ThingRepositoryCache(
c.Get<ThingRepository>(),
cache));
这比控制问题更关注控制器。