diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs index bab468a655..7bffb3895a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs @@ -1,10 +1,12 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers; +[DisableConventionalRegistration] public class InMemoryDynamicBackgroundWorker : AsyncPeriodicBackgroundWorkerBase { public string WorkerName { get; } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker_Registration_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker_Registration_Tests.cs new file mode 100644 index 0000000000..677efbbc5e --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker_Registration_Tests.cs @@ -0,0 +1,37 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Xunit; + +namespace Volo.Abp.BackgroundWorkers; + +public class InMemoryDynamicBackgroundWorker_Registration_Tests +{ + // Reproduces the original failure: ASP.NET Core in Development enables ValidateOnBuild, + // and InMemoryDynamicBackgroundWorker has a `string workerName` constructor parameter + // that DI cannot resolve. Without [DisableConventionalRegistration] this throws: + // Unable to resolve service for type 'System.String' while attempting to activate + // 'Volo.Abp.BackgroundWorkers.InMemoryDynamicBackgroundWorker'. + [Fact] + public async Task BuildServiceProvider_With_ValidateOnBuild_Should_Not_Throw() + { + using var application = await AbpApplicationFactory.CreateAsync(); + + var act = () => application.Services.BuildServiceProvider( + new ServiceProviderOptions { ValidateOnBuild = true }); + + act.ShouldNotThrow(); + } + + // Verifies the fix: InMemoryDynamicBackgroundWorker is created on demand by + // DefaultDynamicBackgroundWorkerManager (`new InMemoryDynamicBackgroundWorker(...)`) + // and must stay out of the conventional registration loop. + [Fact] + public async Task InMemoryDynamicBackgroundWorker_Should_Not_Be_Registered_As_Service() + { + using var application = await AbpApplicationFactory.CreateAsync(); + + application.Services.ShouldNotContain(d => d.ServiceType == typeof(InMemoryDynamicBackgroundWorker)); + } +}