Sha*_*mes 25 c# dependency-injection servicebus azure .net-core
我\xe2\x80\x99m 尝试按照本文中的建议从新的 Azure.Messaging.ServiceBus 包注册以进行依赖项注入,ServiceBusClient但我无法\xe2\x80\x99m 找到任何文档或任何在线帮助来了解具体如何进行对这个。ServiceBusClientBuilderExtensions
我正在尝试添加如下
\npublic override void Configure(IFunctionsHostBuilder builder)\n{\n ServiceBusClientBuilderExtensions.AddServiceBusClient(builder, Typsy.Domain.Configuration.Settings.Instance().Connections.ServiceBusPrimary);\n}\nRun Code Online (Sandbox Code Playgroud)\n但我收到错误
\n\n\n\n类型“Microsoft.Azure.Functions.Extensions.DependencyInjection.IFunctionsHostBuilder”必须可转换为“Azure.Core.Extensions.IAzureClientFactoryBuilder”,才能将其用作通用方法中的参数“TBuilder” IAzureClientBuilder<ServiceBusClient,ServiceBusClientOptions> Microsoft.Extensions.Azure.ServiceBusClientBuilderExtensions.AddServiceBusClient(此 TBuilder, 字符串)\'
\n
如果有人能帮忙解决这个问题那就太好了!
\ndev*_*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)
这个答案来晚了,但这篇文章有一些很好的例子,包括发送者和客户端的 DI 设置:
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)
| 归档时间: |
|
| 查看次数: |
29667 次 |
| 最近记录: |