Получить настройки из файла конфигурации

Я пытаюсь настроить MailKit в ASP.NET Boilerplate для отправки электронных писем, но я продолжаю получать это исключение, хотя я добавил настройки в файл app.config.

Код для отправки электронной почты:

_emailSender.Send(
    to: "*****@gmail.com",
    subject: "You have a new task!",
    body: $"A new task is assigned for you: <b>Create doFramework</b>",
    isBodyHtml: true
);

Получено исключение:

{Abp.AbpException: Setting value for 'Abp.Net.Mail.DefaultFromAddress' is null or empty! at Abp.Net.Mail.EmailSenderConfiguration.GetNotEmptySettingValue(String name) in D:\Github\aspnetboilerplate\src\Abp\Net\Mail\EmailSenderConfiguration.cs:line 44 at Abp.Net.Mail.EmailSenderBase.NormalizeMail(MailMessage mail) in D:\Github\aspnetboilerplate\src\Abp\Net\Mail\EmailSenderBase.cs:line 96 at Abp.Net.Mail.EmailSenderBase.Send(MailMessage mail, Boolean normalize) in D:\Github\aspnetboilerplate\src\Abp\Net\Mail\EmailSenderBase.cs:line 73 at TaskManagmentApp.Tasks.TaskAppService.GetAll(GetAllTasksInput input) in C:\Users\Dopravo\source\repos\doFramework\SampleProjects\TaskManagmentApp\src\TaskManagmentApp.Application\Services\TaskAppService.cs:line 36 at Castle.Proxies.Invocations.ITaskAppService_GetAll.InvokeMethodOnTarget() at Castle.DynamicProxy.AbstractInvocation.Proceed() at Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation invocation, UnitOfWorkOptions options) in D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:line 68 at Castle.DynamicProxy.AbstractInvocation.Proceed() at Abp.Auditing.AuditingInterceptor.PerformSyncAuditing(IInvocation invocation, AuditInfo auditInfo) in D:\Github\aspnetboilerplate\src\Abp\Auditing\AuditingInterceptor.cs:line 51}

app.config файл:

<configuration>
  <runtime>
    <gcServer enabled = "true"/>
  </runtime>
  <appSettings>
    <add key = "Abp.Net.Mail.DefaultFromAddress" value = "[email protected]"/>
    <add key = "Abp.Net.Mail.DefaultFromDisplayName" value = "Lutfi Kaddoura"/>
  </appSettings>     
</configuration>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 089
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из документации по Управление настройками:

The ISettingStore interface must be implemented in order to use the setting system. While you can implement it in your own way, it's fully implemented in the Module Zero project. If it's not implemented, settings are read from the application's configuration file (web.config or app.config) but those settings cannot be changed. Scoping will also not work.

Чтобы вернуться к конфигурационному файлу, создайте подкласс SettingStore и переопределите GetSettingOrNullAsync:

public class MySettingStore : SettingStore
{
    public MySettingStore(
        IRepository<Setting, long> settingRepository,
        IUnitOfWorkManager unitOfWorkManager)
        : base(settingRepository, unitOfWorkManager)
    {
    }

    public override Task<SettingInfo> GetSettingOrNullAsync(int? tenantId, long? userId, string name)
    {
        return base.GetSettingOrNullAsync(tenantId, userId, name)
            ?? DefaultConfigSettingStore.Instance.GetSettingOrNullAsync(tenantId, userId, name);
    }
}

Затем замените ISettingStore в своем модуле:

// using Abp.Configuration.Startup;

public override void PreInitialize()
{
    Configuration.ReplaceService<ISettingStore, MySettingStore>(DependencyLifeStyle.Transient);
}
Ответ принят как подходящий

Наконец-то я смог прочитать настройки, реализовав свой собственный SettingStore, который читается из файла конфигурации. обратите внимание, что вызов GetAllListAsync необходимо реализовать.

   public class MySettingStore : ISettingStore
    {
        public Task CreateAsync(SettingInfo setting)
        {
            throw new NotImplementedException();
        }

        public Task DeleteAsync(SettingInfo setting)
        {
            throw new NotImplementedException();
        }

        public Task<List<SettingInfo>> GetAllListAsync(int? tenantId, long? userId)
        {
            var result = new List<SettingInfo>();
            var keys = ConfigurationManager.AppSettings.AllKeys;

            foreach (var key in keys)
            {
                result.Add(new SettingInfo(null, null, key, ConfigurationManager.AppSettings[key]));
            }

            return Task.FromResult(result);
        }

        public Task<SettingInfo> GetSettingOrNullAsync(int? tenantId, long? userId, string name)
        {
            var value = ConfigurationManager.AppSettings[name];

            if (value == null)
            {
                return Task.FromResult<SettingInfo>(null);
            }

            return Task.FromResult(new SettingInfo(tenantId, userId, name, value));
        }

        public Task UpdateAsync(SettingInfo setting)
        {
            throw new NotImplementedException();
        }
    }

MySettingStore необходимо заменить в PreInitalize () модуля.

public override void PreInitialize()
{
    Configuration.ReplaceService<ISettingStore, MySettingStore>(DependencyLifeStyle.Transient);
} 

Вы имеете в виду, что создание подклассов SettingStore вам не помогло?

aaron 14.05.2018 11:16

я способ. просто SettingStore из Zero Module не сработал для меня. Я бы сказал, что ответ, который я наконец опубликовал, сработал для меня.

Lutfi Kadd 14.05.2018 11:37

Кто-нибудь нашел ответ лучше, чем этот?

IbraHim M. Nada 30.06.2020 20:57

Другие вопросы по теме

Angular 6 «Перед использованием необходимо загрузить рабочее пространство». при попытке создать новый компонент
Развертывание ядра Virtocommerce Storefront в Azure 500 Ошибка
Не удается разрешить конфликт сопоставления между Cyrillic_General_CI_AS и SQL_Latin1_General_CP1_CI_AS в операции равенства
Установите и запустите ASP.NET Core в IIS как приложение (не сайт)
Как выполняется поиск путей к компонентам представления страницы Razor? Мне не удается заставить их работать, .NET Core пытается включить нерелевантную модель
VS Code CSC: ошибка CS1617: недопустимый параметр 7.3 для / langversion
Независимый запуск сервера Create-React-App в приложении, созданном с использованием шаблона .NET Core 2.1 с использованием Visual Studio 17 и «dotnet new reactredux»
Azure AD + Open ID -> Ограничение домена входа
Как использовать другой файл web.config для разных профилей публикации в проекте ASP .NET Core 2.0
Правильный способ настройки файлов cookie IdentityServer4 для входа в систему, токена JWT для авторизации API