关于如何在 .NET 5.0 Worker Service 中最好地使用 DI 注册 EventGridClient 的指南 [英] Guidance on how to best register the EventGridClient with DI in a .NET 5.0 Worker Service

查看:36
本文介绍了关于如何在 .NET 5.0 Worker Service 中最好地使用 DI 注册 EventGridClient 的指南的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Microsoft.Azure.EventGrid NuGet 包中的 EventGridClient 将事件发布到 Azure 事件网格主题.我知道工作服务是用单例生命周期注册的.我正在寻找有关如何最好地将 EventGridClient 注册到工作服务中的 DI 容器的指南?我正在使用 Windows 服务中托管的 .NET 5.0 工作器.

DI 注册(不确定我在这里是否做对了):

Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices((hostContext, services) =>{services.AddSingleton(new EventGridClient(new TopicCredentials("topicKey"),//代理身份验证新的 HttpClientHandler {DefaultProxyCredentials = CredentialCache.DefaultCredentials}));services.AddHostedService();}).建造().跑();

Worker 实现:

公共类工人:BackgroundService{私有只读 EventGridClient 客户端;私有只读 ILogger记录器;公共工作者(EventGridClient客户端,ILogger记录器){this.client = 客户端;this.logger = 记录器;}受保护的覆盖异步任务 ExecuteAsync(CancellationTokentoppingToken){while (!stopingToken.IsCancellationRequested){var events = new List();等待 client.PublishEventsAsync(topicHostname",事件,停止令牌);logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);等待任务.延迟(1000,停止令牌);}}}

非常感谢任何指导.

解决方案

我从 Microsoft 的 Q &我在此处粘贴的网站,以防其他人面临同样的问题.

<块引用>

虽然您的 DI 注册在技术上是好的,是的,它应该是单例的,因为它涉及 http 连接 (参考不正确的实例化反模式获取详细信息),您可以通过将接口IEventGridClient 注册到EventGridClient 使其更好和可测试并改为注入 IEventGridClient.

//....ConfigureServices((hostContext, services) =>{services.AddSingleton<IEventGridClient>(new EventGridClient(new TopicCredentials(topicKey"),//代理身份验证新的 HttpClientHandler {DefaultProxyCredentials = CredentialCache.DefaultCredentials}));services.AddHostedService();})

...

私有只读 IEventGridClient 客户端;私有只读 ILogger记录器;公共工作者(IEventGridClient 客户端,ILogger 记录器){this.client = 客户端;this.logger = 记录器;}

<块引用>

但请注意,由于 PublishEventsAsync 是IEventGridClient,如果您为代码编写单元测试并注入模拟 IEventGridClient,记得模拟设置方法PublishEventsWithHttpMessages 的 IEventGridClient 以便您的测试不会真正调用事件网格.

I'm using the EventGridClient from the Microsoft.Azure.EventGrid NuGet package to publish events to an Azure Event Grid Topic. I understand that worker services are registered with singleton lifetime. I'm looking for guidance on how to best register the EventGridClient with the DI container in a worker service? I'm using a .NET 5.0 worker hosted in a windows services.

DI registration (not sure if I've done the right thing here):

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();

Worker implementation:

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);
        }
    }
}

Any guidance is highly appreciated.

解决方案

I received an answer from Microsoft on their Q & A site which i'm pasting here in case someone else faces the same question.

While your DI registration is technically fine and yes, it should be singleton as it involves http connection (refer Improper Instantiation antipattern for details), you can make it nicer and testable by registering the interface IEventGridClient against EventGridClient and inject IEventGridClient instead.

//...
.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;
     }

But note that since PublishEventsAsync is an extension method of IEventGridClient, if you write unit test for your code and inject a mock of IEventGridClient, remember to mock setup the method PublishEventsWithHttpMessages of IEventGridClient so that your test does not make a real call to event grid.

这篇关于关于如何在 .NET 5.0 Worker Service 中最好地使用 DI 注册 EventGridClient 的指南的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆