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.