Asp.net core ASP.NET内核中的服务总线

Asp.net core ASP.NET内核中的服务总线,asp.net-core,azureservicebus,Asp.net Core,Azureservicebus,我希望我的ASP.NET核心应用程序向Azure服务总线发送消息 在微软的文章中,他们认为应该重用客户端实例 建议您不要在发送消息后关闭消息工厂或队列、主题和订阅客户端,然后在发送下一条消息时重新创建它们 因此,我认为我不应该使用new关键字在控制器内实例化客户机(或)的新实例 我想我应该用 我应该直接插入TopicClient/QueueClient,还是创建自己的类来包装客户端实例并公开SendAsync方法 当使用依赖项注入器注册服务时,我应该将其注册为单例吗?我们使用一个包装器类进行了注

我希望我的ASP.NET核心应用程序向Azure服务总线发送消息

在微软的文章中,他们认为应该重用客户端实例

建议您不要在发送消息后关闭消息工厂或队列、主题和订阅客户端,然后在发送下一条消息时重新创建它们

因此,我认为我不应该使用
new
关键字在控制器内实例化客户机(或)的新实例

我想我应该用

我应该直接插入
TopicClient
/
QueueClient
,还是创建自己的类来包装客户端实例并公开
SendAsync
方法


当使用依赖项注入器注册服务时,我应该将其注册为单例吗?

我们使用一个包装器类进行了注册,然后该包装器类返回TopicClient/QueueClient,并将其注册为单例,并发现这种方法没有大的问题

我们的方法基于Microsoft提供的这个示例


此功能的示例代码可在中找到。他们在需要ServiceBus的服务中的Startup.cs中将此类注册为singleton。

。确认@StuartLC在我的问题上下文中这意味着什么?对于每个客户机,您需要指定要与哪个队列或主题进行通信,这会使将正确的客户机实例注入正确的注入站点变得混乱。因此,如果您有多个主题/队列,您可以考虑创建自己的包装器,该包装器创建并缓存各自的客户端实例。Azure客户端是线程安全的,因此不需要管理围绕它们的争用。您的代码是什么样子的?该方法名为
CreateModel
,这有点令人困惑。但是这不是控制器中使用的,它是
EventBusServiceBus
的一部分,由
IEventBus
在控制器中使用,看起来它违反了接口隔离策略。我们对
IEventBus
进行了抽象,
EventBusServiceBus
是它的服务总线实现。要使该类正常工作,必须在构造函数中为其提供
IAzureServiceBusProvider
(这里有
CreateTopicClient
CreateQueueClient
方法)的实现。然后,我们将AzureServiceBusProvider注册为singleton,以确保我们的代码不会关闭客户端。使用DI,将此
AzureServiceBusProvider
注入到
IServiceBusPersisterConnection
中。没有冲突,因为这些接口都连接到服务总线实现