1

我在 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;
        }
    }


}
4

1 回答 1

0

您的服务未作为 DI 容器公开IHostedService,因此在启动时查找所有这些服务时无法找到它。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不会考虑到这一点,只使用你的手动注册。

于 2021-10-01T14:10:34.380 回答