MVC 6的MemoryCache应该在Controller级别还是在服务级别使用?

时间:2016-06-09 14:47:40

标签: c# asp.net-mvc asp.net-core-mvc software-design

由于ASP.NET Core提供了一个可以注入并成为单例的MemoryCache,是应该在Controller中还是在服务中注入?

我有一个Controller,它调用服务从数据库或外部服务获取信息。在控制器中,我只会将一些信息(一个对象列表转换为List<SelectListItem>)。

我应该在服务级别缓存并将缓存的信息返回给Controller,还是应该缓存已经转换的信息(List<SelectListItem>甚至服务原始信息)?

2 个答案:

答案 0 :(得分:2)

该服务负责更昂贵的操作(从数据库或某些数据库获取数据)。与此相比,您在控制器中执行的转换对性能的影响可以忽略不计,因此从性能角度来看,将此责任放入控制器将无济于事。

此外,可以从多个地方调用相同的服务方法,在这种情况下,您可以从服务层中的缓存中获得更多好处。

从关注点分离&#34;另一方面,你可以使用的另一种策略是将我的成功转移到自己的班级。

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();
  }
}

使用这样的DI绑定,只要有人要求存储库,就将真正的存储库注入缓存中:

Bind<IThingRepository>().ToMethod(c => new ThingRepositoryCache(
   c.Get<ThingRepository>(),
   cache));

答案 1 :(得分:0)

这更像是一个控制器问题,而不是服务问题。