如何注册ServiceBusClient进行依赖注入?

Sha*_*mes 25 c# dependency-injection servicebus azure .net-core

我\xe2\x80\x99m 尝试按照本文中的建议从新的 Azure.Messaging.ServiceBus 包注册以进行依赖项注入ServiceBusClient无法\xe2\x80\x99m 找到任何文档或任何在线帮助来了解具体如何进行对这个。ServiceBusClientBuilderExtensions

\n

我正在尝试添加如下

\n
public override void Configure(IFunctionsHostBuilder builder)\n{\n    ServiceBusClientBuilderExtensions.AddServiceBusClient(builder, Typsy.Domain.Configuration.Settings.Instance().Connections.ServiceBusPrimary);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到错误

\n
\n

类型“Microsoft.Azure.Functions.Extensions.DependencyInjection.IFunctionsHostBuilder”必须可转换为“Azure.Core.Extensions.IAzureClientFactoryBuilder”,才能将其用作通用方法中的参数“TBuilder” IAzureClientBuilder<ServiceBusClient,ServiceBusClientOptions> Microsoft.Extensions.Azure.ServiceBusClientBuilderExtensions.AddServiceBusClient(此 TBuilder, 字符串)\'

\n
\n

在此输入图像描述

\n

如果有人能帮忙解决这个问题那就太好了!

\n

dev*_*ull 45

ServiceBusClientBuilderExtensions.AddServiceBusClient是以下方法的扩展方法IAzureClientFactoryBuilder

public static IAzureClientBuilder<ServiceBusClient, ServiceBusClientOptions> AddServiceBusClient<TBuilder>(this TBuilder builder, string connectionString)
            where TBuilder : IAzureClientFactoryBuilder
Run Code Online (Sandbox Code Playgroud)

要获取 的实例IAzureClientFactoryBuilder,您需要调用AzureClientServiceCollectionExtensions.AddAzureClients(IServiceCollection, Action<AzureClientFactoryBuilder>)给定的IServiceCollection,它提供了给出 的实例的委托IAzureClientFactoryBuilder。(该方法在Microsoft.Extensions.AzureNuGet包中)

要调用该方法,您可以使用IServiceCollection提供的IFunctionsHostBuilder。有了所有这些,您所拥有的应该类似于:

public override void Configure(IFunctionsHostBuilder builder)
{
    builder.Services.AddAzureClients(clientsBuilder =>
    {
        clientsBuilder.AddServiceBusClient(Typsy.Domain.Configuration.Settings.Instance().Connections.ServiceBusPrimary)
          // (Optional) Provide name for instance to retrieve by with DI
          .WithName("Client1Name")
          // (Optional) Override ServiceBusClientOptions (e.g. change retry settings)
          .ConfigureOptions(options =>
          {
              options.RetryOptions.Delay = TimeSpan.FromMilliseconds(50);
              options.RetryOptions.MaxDelay = TimeSpan.FromSeconds(5);
              options.RetryOptions.MaxRetries = 3;
          });
    });
}
Run Code Online (Sandbox Code Playgroud)

要检索命名实例,而不是使用ServiceBusClient您使用的注入类型IAzureClientFactory<ServiceBusClient>无论您是否使用命名实例,它都是单例。ServiceBusClient

 public Constructor(IAzureClientFactory<ServiceBusClient> serviceBusClientFactory)
 {
     // Wherever you need the ServiceBusClient
     ServiceBusClient singletonClient1 = serviceBusClientFactory.CreateClient("Client1Name")
 }
Run Code Online (Sandbox Code Playgroud)


ser*_*giu 13

对于那些只需要单个服务总线客户端的人来说,一个简单的单例就足够了

(使用 .Net 6 Azure Functions v4 进行测试):

using Azure.Messaging.ServiceBus;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using System;

[assembly: FunctionsStartup(typeof(YourProjName.Startup))]

namespace YourProjName
{
 public class Startup : FunctionsStartup
 {
    public override void Configure(IFunctionsHostBuilder builder)
    {
       
        var serviceBusConnectionString = Environment.GetEnvironmentVariable("ServiceBusConnectionString");
        if (string.IsNullOrEmpty(serviceBusConnectionString))
        {
            throw new InvalidOperationException(
                "Please specify a valid ServiceBusConnectionString in the Azure Functions Settings or your local.settings.json file.");
        }

        //using AMQP as transport
        builder.Services.AddSingleton((s) => {
            return new ServiceBusClient(serviceBusConnectionString, new ServiceBusClientOptions() { TransportType = ServiceBusTransportType.AmqpWebSockets }); 
        });

    }
 }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在 Azure Function 构造函数中使用它:

public Function1(ServiceBusClient client)
   {
       _client = client;
   }
Run Code Online (Sandbox Code Playgroud)


jon*_*dow 6

这个答案来晚了,但这篇文章有一些很好的例子,包括发送者和客户端的 DI 设置:

https://learn.microsoft.com/en-us/dotnet/api/overview/azure/messaging.servicebus-readme?view=azure-dotnet#registering-with-aspnet-core-dependency-injection

public async Task ConfigureServicesAsync(IServiceCollection services)
{
var adminClient = new ServiceBusAdministrationClient("<< SERVICE BUS CONNECTION STRING >>");
var queueNames = new List<string>();

await foreach (var queue in adminClient.GetQueuesAsync())
{
    queueNames.Add(queue.Name);
}

services.AddAzureClients(builder =>
{
    builder.AddServiceBusClient("<< SERVICE BUS CONNECTION STRING >>");

    foreach (var queueName in queueNames)
    {
        builder.AddClient<ServiceBusSender, ServiceBusClientOptions>((_, _, provider) =>
            provider
                .GetService<ServiceBusClient>()
                .CreateSender(queueName)
        )
        .WithName(queueName);
    }
});

}
Run Code Online (Sandbox Code Playgroud)