我在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();
}
答案 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;
}
}