【问题标题】:Asp.net Boilerplate - Implement setting manager with databaseAsp.net Boilerplate - 使用数据库实现设置管理器
【发布时间】:2017-09-10 10:53:38
【问题描述】:

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

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

目前我能找到的唯一帖子是this,但hikalkan 提供的链接已损坏。

感谢您的帮助, 乔

【问题讨论】:

    标签: asp.net-core aspnetboilerplate


    【解决方案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 中使用这些方法 ChangeSettingForApplicationAsyncChangeSettingForTenantAsyncChangeSettingForUserAsync

    【讨论】:

    • 对于 AbpSettings 表,我是否必须在我的代码优先类中创建它?我无法在 ABP 网站上找到有关该表的任何文档。
    • 您不需要为设置表创建类。您无需修改​​该表。正如我向您展示的那样,您必须使用 SettingManager 来获取和更改值。和 MySettingProvider 来创建新的设置。就是这样了。这很简单。我在答案的末尾添加了方法名称来更改设置值。 (顺便说一句,如果可以,请接受我的回答!)
    • 对不起,我还是不太明白它是如何保存到数据库中的。我的数据库中没有 AbpSettings 表,我使用的是 ABP 项目模板。我不明白 SettingManager 如何将设置保存/更新到不存在的 AbpSettings 表。我目前确实有一个实现设置管理器的类,但现在它只是硬编码值,返回一个设置定义数组,如 ABP 文档中的示例所示。
    • 所以你对迁移有不同的问题。确保所有迁移成功应用。必须有设置表
    • 默认情况下,ABP 项目模板在 EF 上下文文件中没有 AbpSettings DbSet。我需要添加它吗?像这样的东西?公共 DbSet AbpSettings { get;放; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多