关于如何在.net 5.0 Worker Service中用DI最好地注册EventGridClient的指导



我正在使用来自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连接(参考不当实例化反模式的细节),你可以通过注册接口IEventGridClientEventGridClient并注入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,使您的测试没有真正调用事件网格。

最新更新