我正在使用来自Microsoft.Azure.EventGrid NuGet包的EventGridClient来将事件发布到Azure事件网格主题。我知道工作者服务是用单例生命周期注册的。我正在寻找指导如何最好地注册EventGridClient与DI容器中的工人服务?我使用的是。net 5.0 worker,它托管在windows services中。
DI注册(不确定我是否在这里做了正确的事情):
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton(new EventGridClient(new TopicCredentials("topicKey"), // proxy auth
new HttpClientHandler {DefaultProxyCredentials = CredentialCache.DefaultCredentials}));
services.AddHostedService<Worker>();
})
.Build()
.Run();
职工实现:
public class Worker : BackgroundService
{
private readonly EventGridClient client;
private readonly ILogger<Worker> logger;
public Worker(EventGridClient client, ILogger<Worker> logger)
{
this.client = client;
this.logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var events = new List<EventGridEvent>();
await client.PublishEventsAsync("topicHostname", events, stoppingToken);
logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
任何指导都非常感谢。
我收到了微软关于他们的问题的答案。我把这个网站贴在这里,以防别人遇到同样的问题。
虽然你的DI注册在技术上是好的,是的,它应该是单例的,因为它涉及到http连接(参考不当实例化反模式的细节),你可以通过注册接口
IEventGridClient
对EventGridClient
并注入IEventGridClient来使它更好和可测试。
//...
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<IEventGridClient>(new EventGridClient(new TopicCredentials("topicKey"), // proxy auth
new HttpClientHandler {DefaultProxyCredentials = CredentialCache.DefaultCredentials}));
services.AddHostedService<Worker>();
})
…
private readonly IEventGridClient client;
private readonly ILogger<Worker> logger;
public Worker(IEventGridClient client, ILogger<Worker> logger)
{
this.client = client;
this.logger = logger;
}
但是注意,因为publishheventsasync是如果您为代码编写单元测试并注入模拟的,记得模拟设置方法
PublishEventsWithHttpMessages
的IEventGridClient,使您的测试没有真正调用事件网格。