2016-06-09 56 views
1

由于ASP.NET Core提供的MemoryCache可以注入并且是单身,它应该注入Controller还是Service?MVC 6的MemoryCache应该用于控制器级还是服务级?

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

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

回答

2

服务负责更昂贵的操作(从数据库或一些这样获得的数据)。与此相比,你在控制器执行转换有一个可以忽略不计的性能影响,所以把这个责任到控制器不会从性能的角度帮助。

此外,它有可能是相同的服务方法可以从多个地方,在这种情况下,你会得到更多的受益于高速缓存在服务层被调用。

从的角度来看“关注点分离”,另一种策略可以使用,这我已经成功用,是移动缓存责任融入到自己的类。

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)); 
0

这比控制问题更关注控制器。

相关问题