Asp.net Boilerplate-用数据库实现设置管理器



我一直在使用asp.net样板模板构建一个asp.net核心网站。到目前为止,我已经将所有设置存储在appsettings.json文件中。随着应用程序越来越大,我想我应该开始通过ABP的SettingsProvider和ISettingStore存储一些设置。

我的问题是,有没有人拥有或知道一个示例应用程序,它展示了如何实现ISettingStore并将设置存储在数据库中?

到目前为止,我能找到的唯一帖子是这个,但hikalkan供应的链接断了。

谢谢你的帮助,Joe

ABP使用默认值在内存中存储设置。在数据库中插入新的设置值时,它会从数据库中读取并覆盖默认值。所以基本上,当数据库并没有设置时,就意味着所有的设置都是默认值。设置值存储在AbpSettings表中。开始使用设置机制。创建从SettingsProvider继承的自己的SettingsProvider。在模块中初始化它(例如:ModuleZeroSampleProjectApplicationModule(。由于SettingProvider自动注册到依赖项注入;您可以将ISettingManager注入到任何需要的位置。

public class MySettingProvider : SettingProvider
{
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
return new[]
{
new SettingDefinition(
"SmtpServerAddress",
"127.0.0.1"
),
new SettingDefinition(
"PassiveUsersCanNotLogin",
"true",
scopes: SettingScopes.Application | SettingScopes.Tenant
),
new SettingDefinition(
"SiteColorPreference",
"red",
scopes: SettingScopes.User,
isVisibleToClients: true
)
};
}
}

在应用程序服务和控制器中,您不需要注入ISettingManager(因为已经注入了属性(,您可以直接使用SettingManager属性。例如:

//Getting a boolean value (async call)
var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");

对于其他类(如域服务(,可以注入ISettingManager

public class UserEmailer :  ITransientDependency
{
private readonly ISettingManager _settingManager;
public UserEmailer(ISettingManager settingManager)
{
_settingManager = settingManager;            
}
[UnitOfWork]
public virtual async Task TestMethod()
{
var settingValue = _settingManager.GetSettingValueForUser("SmtpServerAddress", tenantAdmin.TenantId, tenantAdmin.Id);
}
}

注意:要修改设置,您可以在SettingManager中使用这些方法ChangeSettingsForApplicationAsyncChangeSettingsForTenantSyncchangeSettingsForUserAsync

最新更新