如何在ASP.NET Boilerplate中使用缓存?

时间:2017-12-05 07:17:14

标签: aspnetboilerplate

我在DB中有一些主数据,我需要在整个应用程序中使用。那么在应用程序中定义这些数据的最佳方法是什么?我应该在应用程序中定义哪里,以便每次应用程序启动时,我都会在应用程序中初始化此主数据。我应该在哪里定义从DB获取数据的方法?

using System.Linq;
using System.Threading.Tasks;
using Abp.Application.Services.Dto;
using Abp.Authorization;
using Abp.Runtime.Caching;
using Test.Authorization;
using Test.Caching.Dto;

namespace Test.Caching
{
    [AbpAuthorize(AppPermissions.Pages_Administration_Host_Maintenance)]
    public class CachingAppService : TestAppServiceBase, ICachingAppService
    {
        private readonly ICacheManager _cacheManager;

        public CachingAppService(ICacheManager cacheManager)
        {
            _cacheManager = cacheManager;
        }

        public ListResultDto<CacheDto> GetAllCaches()
        {
            var caches = _cacheManager.GetAllCaches()
                                        .Select(cache => new CacheDto
                                        {
                                            Name = cache.Name
                                        })
                                        .ToList();

            return new ListResultDto<CacheDto>(caches);
        }

        public async Task ClearCache(EntityDto<string> input)
        {
            var cache = _cacheManager.GetCache(input.Id);
            await cache.ClearAsync();
        }

        public async Task ClearAllCaches()
        {
            var caches = _cacheManager.GetAllCaches();
            foreach (var cache in caches)
            {
                await cache.ClearAsync();
            }
        }
    }
}

Startup.cs代码:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
   services.AddMemoryCache();
}

1 个答案:

答案 0 :(得分:1)

此答案基于Entity Caching的文档。

  

在应用程序中定义此数据的最佳方法是什么?

作为缓存项目:

[AutoMapFrom(typeof(Person))]
public class PersonCacheItem
{
    public string Name { get; set; }
}
  

我应该在应用程序中定义哪些应用程序启动时,我将在应用程序中初始化此主数据?如何将我的数据添加到缓存?我在哪里需要将数据添加到缓存中?

您不初始化主数据(也不会将数据添加到IEntityCache)。这是懒惰的。

默认缓存过期时间为60分钟。它在滑动。因此,如果您不在缓存中使用项目60分钟,它将自动从缓存中删除。您可以为所有缓存或特定缓存配置它。

// Configuration for a specific cache
Configuration.Caching.Configure("MyCache", cache =>
{
    cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);
});

此代码应放在模块的 PreInitialize 方法中。

  

我应该在哪里定义从DB获取数据的方法?

您没有定义方法。只需注入一个IRepository。如果在上面配置,请指定cacheName

public class PersonCache : EntityCache<Person, PersonCacheItem>, IPersonCache, ITransientDependency
{
    public PersonCache(ICacheManager cacheManager, IRepository<Person> repository)
        : base(cacheManager, repository, "MyCache") // "MyCache" is optional
    {
    }
}

public interface IPersonCache : IEntityCache<PersonCacheItem>
{
}
  

我如何从缓存中获取数据?

使用Person缓存的示例类:

public class MyPersonService : ITransientDependency
{
    private readonly IPersonCache _personCache;

    public MyPersonService(IPersonCache personCache)
    {
        _personCache = personCache;
    }

    public string GetPersonNameById(int id)
    {
        return _personCache[id].Name; // alternative: _personCache.Get(id).Name;
    }
}