gpt4 book ai didi

asp.net-core - 如何注入(inject)对特定 IHostedService 实现的引用?

转载 作者:行者123 更新时间:2023-12-02 01:47:24 28 4
gpt4 key购买 nike

我的网络应用程序有一个监听服务总线的后台服务。基于docs ,看起来运行后台服务的内置方法是实现 IHostedService

所以我有一些如下所示的代码:

public class ServiceBusListener : IMessageSource<string>, IHostedService
{
public virtual event ServiceBusMessageHandler<string> OnMessage = delegate { };

public Task StartAsync(CancellationToken cancellationToken)
{
// run the background task...
}

// ... other stuff ...
}

然后在 Startup.cs 中注册该服务:

services.AddSingleton<IHostedService, ServiceBusListener>();

更新到 ASP.NET 2.1 后,我可以使用新的便捷方法:

services.AddHostedService<ServiceBusListener>();

但我相信两者在功能上是等效的。

复杂性:我的 Web 应用程序有多个 IHostedService 实现(具体来说,服务总线监听器的不同实例)。

问题:如何让其他组件获取对特定托管服务实现(我的服务总线监听器)的引用?换句话说,如何将特定实例注入(inject)到组件中?

用例:我的后台服务监听服务总线消息,然后将消息作为 .NET 事件重新发布(如果您想知道,使用的代码会处理线程问题)。如果事件发生在后台服务上,则订阅者需要获取对后台服务的引用才能订阅。

我尝试过的:如果我做了明显的事情并将 ServiceBusListener 声明为要注入(inject)到不同组件中的依赖项,我的启动代码会抛出“Could无法解决类型为“的服务异常。

是否有可能请求 IHostedService 的特定实现?如果没有,最好的解决方法是什么?引入我的服务和消费者都可以引用的第三个组件?避免使用 IHostedService 并手动运行后台服务?

最佳答案

事实证明有一种简单的方法可以做到这一点(感谢您的指点,Steven)。

如果您需要能够注入(inject)/获取对某些服务的引用,请继续正常注册该服务(无需担心任何 IHostedService 内容):

services.AddSingleton<ServiceBusListener>();

现在我们可以注册一个单独的托管服务,其唯一的职责是启动/停止我们刚刚注册的服务:

services.AddHostedService<BackgroundServiceStarter<ServiceBusListener>>();

其中 BackgroundServiceStarter 是一个辅助类,如下所示:

public class BackgroundServiceStarter<T> : IHostedService where T:IHostedService
{
readonly T backgroundService;

public BackgroundServiceStarter(T backgroundService)
{
this.backgroundService = backgroundService;
}

public Task StartAsync(CancellationToken cancellationToken)
{
return backgroundService.StartAsync(cancellationToken);
}

public Task StopAsync(CancellationToken cancellationToken)
{
return backgroundService.StopAsync(cancellationToken);
}
}

更新 2018/8/6:根据 ygoe 的建议,更新了代码以避免服务定位器模式

关于asp.net-core - 如何注入(inject)对特定 IHostedService 实现的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254053/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com