ABP框架如何从数据库/外部API加载本地化资源?
ABP框架从数据库加载本地化资源配置方案
要在ABP框架中从数据库加载本地化资源,需要自定义本地化资源贡献者(Contributor)替换默认的文件加载逻辑,具体步骤如下:
1. 定义本地化存储实体与仓储
首先创建数据库实体,用于持久化翻译内容:
public class LocalizationText : Entity<Guid> { public string ResourceName { get; set; } // 对应本地化资源类名称(如MetadataResource) public string CultureName { get; set; } // 文化编码(如en、zh-Hans) public string Key { get; set; } // 本地化键 public string Value { get; set; } // 翻译值 }
实现仓储接口与EF Core实现,用于查询数据库中的翻译数据:
public interface ILocalizationTextRepository : IRepository<LocalizationText, Guid> { Task<List<LocalizationText>> GetListAsync(string resourceName, string cultureName); } public class LocalizationTextRepository : EfCoreRepository<MyDbContext, LocalizationText, Guid>, ILocalizationTextRepository { public LocalizationTextRepository(IDbContextProvider<MyDbContext> dbContextProvider) : base(dbContextProvider) { } public async Task<List<LocalizationText>> GetListAsync(string resourceName, string cultureName) { return await DbSet .Where(t => t.ResourceName == resourceName && t.CultureName == cultureName) .ToListAsync(); } }
2. 实现数据库本地化贡献者
继承LocalizationContributor,重写资源加载逻辑,从数据库获取翻译内容:
public class DbLocalizationContributor : LocalizationContributor { private readonly ILocalizationTextRepository _localizationTextRepository; public DbLocalizationContributor(ILocalizationTextRepository localizationTextRepository) { _localizationTextRepository = localizationTextRepository; } public override async Task<IReadOnlyList<LocalizationString>> GetStringsAsync( LocalizationResource resource, string cultureName, bool includeDefaults = false) { var dbTexts = await _localizationTextRepository.GetListAsync(resource.Name, cultureName); return dbTexts.Select(t => new LocalizationString(t.Key, t.Value)).ToList(); } public override Task<bool> IsResourceExistsAsync(LocalizationResource resource) { // 可根据实际业务判断资源是否存在,此处默认返回true return Task.FromResult(true); } }
3. 配置本地化资源使用数据库贡献者
在模块的ConfigureServices方法中,替换原有的文件加载方式为数据库贡献者:
public override void ConfigureServices(ServiceConfigurationContext context) { Configure<AbpLocalizationOptions>(options => { // 为英文添加MetadataResource并绑定数据库贡献者 options.Resources .Add<MetadataResource>("en") .AddBaseTypes(typeof(AbpValidationResource)) .AddContributor<DbLocalizationContributor>(); // 如需支持中文,添加对应文化的资源配置 options.Resources .Get<MetadataResource>() .AddCulture("zh-Hans") .AddContributor<DbLocalizationContributor>(); }); }
额外说明
- 缓存优化:为避免频繁查询数据库,可在
DbLocalizationContributor中集成IDistributedCache或IMemoryCache,缓存对应资源与文化的翻译内容。 - 混合加载:若需同时使用文件与数据库资源,可保留
AddVirtualJson并添加AddContributor,ABP会自动合并两者内容,数据库中的键值会覆盖文件中的同名键。 - 外部API适配:如果要从外部API加载资源,只需修改
DbLocalizationContributor中的数据获取逻辑,将数据库查询替换为API调用即可。
内容的提问来源于stack exchange,提问作者Mantas Čekanauskas
相关产品推荐
相关产品推荐

