我使用asp.net样板模板构建了一个asp.net核心网站。截至目前,我已将所有设置存储在appsettings.json文件中。随着应用程序变得越来越大,我想我应该开始通过ABP的SettingProvider和ISettingStore存储一些设置。
我的问题是,是否有人拥有或知道一个示例应用程序,它展示了如何实现ISettingStore并将设置存储在数据库中?
到目前为止,我能找到的唯一一个帖子是this,但链接hikalkan供应已被破坏。
感谢您的帮助, 乔
答案 0 :(得分:1)
ABP使用默认值存储内存设置。将新设置值插入数据库时,它将从数据库中读取并覆盖默认值。所以基本上当数据库没有设置时,它意味着所有设置都是默认值。设置值存储在AbpSettings表中。 开始使用设置机制。创建自己的SettingProvider继承自SettingProvider。在您的模块中初始化它(例如: 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 ChangeSettingForApplicationAsync , ChangeSettingForTenantAsync 和 ChangeSettingForUserAsync
中使用这些方法