【问题标题】:Singleton BackgroundService not started by AutofacAutofac 未启动 Singleton BackgroundService
【发布时间】:2021-09-27 07:59:59
【问题描述】:

我在 ASP.NET Core 3.1 REST API 中运行 Autofac.Extensions.DependencyInjection 7.1.0。

我有一个BackgroundService 类并配置为作为SingleInstance 运行。

我的问题是 StartAsync 永远不会被调用。但是配置没有 SingleInstance 语句,StartAsync 被调用。

这是一个错误,配置不正确还是误解?

注册:

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
             .AsImplementedInterfaces()
             .Except<BackgroundSendMailService>(ct => ct.As<IBackgroundSendMailService>()
                .SingleInstance())
             .PublicOnly();

后台服务:

using Microsoft.Extensions.Hosting;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace TheNameSpace
{
    public interface IBackgroundSendMailService : IHostedService
    {
        Task SendMail(List<EmailModel> emails);
    }

    public class BackgroundSendMailService : BackgroundService, IBackgroundSendMailService
    {
        public BackgroundSendMailService()
        {

        }

        public Task SendMail(List<EmailModel> emails)
        {
            return Task.CompletedTask;
        }

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

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

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            return Task.CompletedTask;
        }
    }


}

【问题讨论】:

    标签: autofac autofac-configuration


    【解决方案1】:

    您的服务没有以IHostedService 的形式暴露给 DI 容器,因此在启动时查找所有这些服务时无法找到它。 DI 容器只有在专门寻找IBackgroundSendMailService 时才能解决它。

    改变这部分

    .Except<BackgroundSendMailService>(ct => ct.As<IBackgroundSendMailService>()
                                               .SingleInstance())
    

    到这个

    .Except<BackgroundSendMailService>(ct => ct.As<IBackgroundSendMailService>()
                                               .As<IHostedService>()
                                               .SingleInstance())
    

    或类似的东西:

    .Except<BackgroundSendMailService>(ct => ct.AsImplementedInterfaces()
                                               .SingleInstance())
    

    编辑:我刚刚注意到您在程序集注册中使用了AsImplementedInterfaces(),但我猜Except 不会考虑到这一点,而只是使用您的手动注册。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2015-07-30
      • 2015-09-01
      相关资源
      最近更新 更多