Asp.net Boilerplate — реализация диспетчера настроек с базой данных

Я создавал основной веб-сайт asp.net, используя шаблон шаблона asp.net. На данный момент я храню все настройки в файле appsettings.json. Поскольку приложение становится больше, я думаю, что мне следует начать сохранять некоторые настройки через SettingProvider и ISettingStore ABP.

Мой вопрос: есть ли у кого-нибудь пример приложения, в котором показано, как реализовать ISettingStore и сохранить настройки в базе данных?

Единственный пост, который я смог найти, это это, но ссылка, которую предоставляет hikalkan сломано.

Спасибо за любую помощь, Джо


person Joe Washek    schedule 29.08.2017    source источник


Ответы (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);
            }
   }

Примечание. Чтобы изменить параметр, вы можете использовать эти методы в диспетчере настроек ChangeSettingForApplicationAsync, ChangeSettingForTenantAsync и ChangeSettingForUserAsync.

person Alper Ebicoglu    schedule 05.09.2017
comment
Нужно ли создавать таблицу AbpSettings в моих классах с кодом? Я не смог найти никакой документации на веб-сайте ABP, касающейся этой таблицы. - person Joe Washek; 07.09.2017
comment
вам не нужно создавать класс для таблицы настроек. Вам не нужно изменять эту таблицу. Как я показал вам, вы должны использовать SettingManager для получения и изменения значений. И MySettingProvider для создания новых настроек. Итак, это все. Это очень просто. Я добавил имена методов для изменения значения параметра в конце своего ответа. (Кстати, примите мой ответ, если все в порядке!) - person Alper Ebicoglu; 08.09.2017
comment
Извините, но я все еще не совсем понимаю, как он может сохранять в базу данных. В моей базе данных нет таблицы AbpSettings, и я использую шаблон проекта ABP. Я не понимаю, как SettingManager может сохранять/обновлять настройки в несуществующей таблице AbpSettings. В настоящее время у меня есть класс, реализующий менеджер настроек, но пока это просто жестко закодированные значения, возвращающие массив SettingDefinitions, как показано в примере в документации ABP. - person Joe Washek; 09.09.2017
comment
так что у вас другая проблема с мигратонами. убедитесь, что все миграции успешно применены. Должна быть таблица настроек - person Alper Ebicoglu; 09.09.2017
comment
По умолчанию шаблон проекта политики адресных книг не имеет DbSet AbpSettings в файле контекста EF. Мне нужно добавить его? Что-то вроде этого? public DbSet‹SettingDefinition› AbpSettings { get; установлен; } - person Joe Washek; 09.09.2017
comment
Кажется, я понял, что здесь есть разрыв. Я работаю с базовым бесплатным шаблоном ABP, а не с нулевым модулем. Согласно документации по управлению настройками на сайте ABP, только шаблон с нулевым модулем поставляется с полностью реализованной системой настроек по умолчанию. В бесплатном шаблоне, кажется, вам нужно создать свою собственную реализацию. - person Joe Washek; 10.09.2017
comment
Да, верно. Нулевой модуль включает Управление настройками (aspnetboilerplate.com/Pages/Documents/Setting-Management ) - person Alper Ebicoglu; 11.09.2017
comment
@AlperEbicoglu: Alper, я добавил код для настройки валюты, и он предназначен для арендаторов, теперь на стороне клиента я могу получить доступ только к значению по умолчанию, мой вопрос: как мы можем установить несколько значений для настройки Currecny? и есть ли компонент пользовательского интерфейса для него где-нибудь? - person Bharat; 29.12.2017
comment
может быть, вы можете задать этот новый вопрос. новичкам будет полезнее - person Alper Ebicoglu; 30.12.2017