【问题标题】:Calling AddHostedServices multiple times doesn't create multiple instances多次调用 AddHostedServices 不会创建多个实例
【发布时间】:2021-09-01 12:41:48
【问题描述】:

So I thought I'd solved my own question(在同事的帮助下)。

基本上,我试图创建一个类的两个实例,作为托管服务,每个实例都有不同的参数。

然而,似乎虽然有两次对AddHostedService 的调用,但实际上只有一个实例被实例化了。

这是怎么回事?

【问题讨论】:

  • 你想完成什么?为什么需要启动两次相同的托管服务?
  • @Steven - 相同的服务,不同的注入参数
  • 您能否更新您的问题以反映这一点?
  • @Steven - 公平点

标签: c# asp.net-core dependency-injection


【解决方案1】:

这是此处记录的故意行为:https://github.com/dotnet/runtime/issues/38751

source 可以看出,托管服务将通过调用 TryAddEnumerable 注册为单例。

public static IServiceCollection AddHostedService<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] THostedService>(this IServiceCollection services)
    where THostedService : class, IHostedService
{
    services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, THostedService>());

    return services;
}

TryAddEnumerable 方法将迭代所有当前服务并比较 ServiceType 和实现者类型。如果它确定注册已经存在,则不会添加额外的注册。

【讨论】:

  • 请注意,您可以多次将其添加为单例...只是默认的AddHostedService 不会这样做,但您可以使用AddSingleton(而不是TryAdd)和它'将添加相同的IHostedService 多次就好了
  • 好点,我会明确指出这一点。
  • 好的,我已经尝试过了,但是现在 Worker:BackgroundWorkerStartAsync 方法没有被调用。如何获得对这个单例的引用,以便手动调用它?
  • 从哪里调用?你想解决什么问题?您的问题具体是为什么这不起作用,答案是设计使然。如果您对要完成的工作有单独的问题,则可能应该单独回答。
  • 没关系,我已经整理好了,不得不用services.AddSingleton&lt;IHostedService&gt;感谢指点我的来源
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 2021-06-10
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多