Использование IEmailSender из Configure () в моем файле Startup.cs при получении исключений - PullRequest
1 голос
/ 04 октября 2019

Я хотел бы отправить электронное письмо в моем методе Configure внутри моего файла Startup.cs, когда получаю исключения.

Я использую IEmailSender и регистрирую его в автозагрузке. cs файл как этот для остальной части приложения.

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IEmailSender, EmailSender>();
}

Но теперь я хочу использовать его ниже в методе Configure, когда получаю исключение, но я не уверен, как создать его экземпляр и /или используйте _emailSender, то есть IEmailSender, который обычно вставляется в конструктор класса, использующего его, но в этом случае (Startup.cs) я не могу внедрить его, потому что он не был определен, пока не будет запущен метод ConfigureServices идобавляет его в качестве услуги.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, Seed seeder)
{
     app.UseExceptionHandler(builder => { builder.Run(async context => {
     // where _emailSender is a IEmailSender emailSender   
     await _emailSender.SendEmailAsync("someone@gmail.com", "some subject", "hey an exception error!");
       });
     });
}

1 Ответ

1 голос
/ 04 октября 2019

Извлеките поставщика услуг из контекста и используйте его для разрешения нужных типов

public void Configure(IApplicationBuilder app, IHostingEnvironment env, Seed seeder) {

    //...

    app.UseExceptionHandler(errorApp  => { 
        errorApp.Run(async context => {
            IServiceProvider services = context.RequestServices;
            IEmailSender emailSender = services.GetRequiredService<IEmailSender>();
            UserExceptionOptions options = services.GetRequiredService<IOptions<UserExceptionOptions>>().Value;

            await emailSender.SendEmailAsync(options.ExceptionEmailAddress, "some subject", "hey an exception error!");
        });
    });

    //...
}

Затем разрешенные службы можно использовать по мере необходимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...