【发布时间】:2021-08-25 21:50:04
【问题描述】:
在一个解决方案中,我有一个 .net 5 ASP.NET Core Web API,它包含一个接口 IEmailSender 和相应的 EmailSender 实现,以及一个控制台应用程序项目。
在控制台应用程序中,我创建了一个派生的计划服务,在 catch 块中,我想使用 EmailSender 发送一封电子邮件,其中包含系统中引发的错误的详细信息。
public StockOpeningValuesUpdateScheduledService(IScheduleConfig<StockOpeningValuesUpdateScheduledService> config, IHttpClientFactory factory, IServiceProvider serviceProvider)
: base(config.CronExpression, config.TimeZoneInfo, serviceProvider)
{
_factory = factory;
_serviceProvider = serviceProvider;
}
public override async Task DoWork(CancellationToken cancellationToken = default)
{
try
{
var client = _factory.CreateClient("trading");
await client.PostAsync("company-buyable-shares/update-opening-values", null, cancellationToken);
}
catch (Exception ex)
{
using var serviceScope = _serviceProvider.CreateScope();
var emailSender = serviceScope.ServiceProvider.GetRequiredService<IEmailSender>();
await emailSender.SendAbnormalEventEmailAsync(ex);
}
}
我在控制台应用程序的Program.cs 中调用预定服务,并尝试将EmailSender 注册为范围服务。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((_, services) =>
{
services.AddHttpClient("trading", client =>
client.BaseAddress = new Uri("https://localhost:44395"));
services.AddScoped<IEmailSender, EmailSender>()
.AddScheduledService<StockOpeningValuesUpdateScheduledService>(service =>
{
service.CronExpression = "*/2 * * * *";
service.TimeZoneInfo = TimeZoneInfo.Utc;
});
});
当我在控制台应用程序中模拟错误时(为了接收有关它的电子邮件) 我得到一个例外
System.InvalidOperationException: 'Unable to resolve service for type 'StockTradingSimulator.BusinessLayer.Services.IEmailService' while attempting to activate 'StockTradingSimulator.BusinessLayer.Helpers.EmailSender'.
在 Web API 中,我在上面的 catch 块中进行了设置,用于调用范围服务方法的另一个派生计划服务。此功能正在运行,可能是因为计划服务、作用域服务及其接口在同一个项目中。
有人知道如何在我的控制台应用程序中注册并成功调用EmailSender?
谢谢。
【问题讨论】:
标签: c# api dependency-injection console-application service-provider