asp.net-core – 如何注入对特定IHostedService实现的引用?
我的网络应用程序有一个后台服务,可以收听服务总线.基于
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实现(特别是服务总线监听器的不同实例). 问题:如何让其他组件获得对特定托管服务实现(我的服务总线监听器)的引用?换句话说,如何将特定实例注入组件? 用例:我的后台服务侦听服务总线消息,然后重新发布消息作为.NET事件(如果您想知道,消费代码处理线程问题).如果事件在后台服务上,则订阅者需要获得对后台服务的引用才能进行订阅. 我尝试过:如果我做了显而易见的事情并将ServiceBusListener声明为注入不同组件的依赖项,我的启动代码会抛出“无法解析类型的服务”异常. 甚至可以请求IHostedService的特定实现吗?如果没有,最好的解决方法是什么?介绍我的服务和消费者可以参考的第三个组件?避免使用IHostedService并手动运行后台服务? 解决方法
原来有一种简单的方法可以做到这一点(感谢指针,Steven).
如果您需要能够注入/获取某些服务的引用,请继续正常注册服务(不必担心任何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-mvc – 如何使用需要js的Kendo UI MVC Extensions?
- 为什么这个ASP.Net Code-behind中的if语句不起作用?
- asp.net – MVC 3/4 HttpModule或ActionFilter
- 如何在ASP.NET Core应用程序运行Vue并且部署在IIS上详解
- 如何在ASP.NET中最好地填充HTML表?
- asp.net – 可以为IIS的HTTP压缩添??加axd扩展吗?
- asp.net-mvc – ASP.NET MVC / IIS 7.5:500内部服务器仅针
- asp.net-mvc-3 – 在IIS上运行时,ASP.NET Web应用程序中的模
- 获取ASP.NET中所有活动会话的列表
- Mvc分页组件MvcSimplePager代码重构及使用
- asp.net – 如何通过命令按钮发送多个命令参数?
- asp.net-core – 在Microsoft.AspNet.Http.HttpC
- asp.net – Chrome网络标签中的延迟测量
- asp.net – 自上一步以来,进程或线程已更改
- asp.net-mvc-3 – MVC 3 – Html.EditorFor似乎缓
- asp.net – AutoEventWireup True Vs False
- asp.net – 为了使用jQuery查找它而唯一的目的是
- asp.net-mvc – ASP.NET MVC的最佳实践
- asp.net – 将下拉列表绑定到gridview中的editIt
- asp.net-mvc-5 – MVC5:我在哪里可以获得System