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 – View中的意外NullReferenceException
- 处理global.asax ASP.NET MVC中的异常
- asp-classic – 检查VBScript中是否存在Object
- asp.net-mvc – ASP.NET MVC中基础控制器类的好候选人是什么
- asp.net-mvc – 条件ASP.NET MVC剃刀部分
- asp.net-mvc – Azure托管的ASP.NET MVC网站删除与客户端缓
- asp.net-mvc-4 – 如何开发一个ASP.NET Web API接受一个复杂
- asp.net-mvc – 存储库模式:每个实体一个存储库类?
- asp.net – WebResource Hell – 找不到资源
- .Net人的源代码控制
- 单元测试 – 自动测试经典ASP
- asp.net-mvc – 给定htmlHelper动作名称,如何找出
- asp.net-mvc – Asp.net MVC TextArea
- 在ASP.NET 3.5中的Response.Clear
- asp.net – IIS HTTP错误500.19
- asp.net-mvc-3 – 为什么ValidationSummary(true
- 通过HTTPS在ASP.NET中安全的会话cookie
- asp.net – Response.Write和UpdatePanel
- asp.net-mvc – 控制器操作无法从JSON读取Guid P
- asp.net-mvc – 如何扩展html.textboxfor以删除n
