diff --git a/src/MediatR/MicrosoftExtensionsDI/MediatRServiceCollectionExtensions.cs b/src/MediatR/MicrosoftExtensionsDI/MediatRServiceCollectionExtensions.cs index 13a0fc76..30ddfd3c 100644 --- a/src/MediatR/MicrosoftExtensionsDI/MediatRServiceCollectionExtensions.cs +++ b/src/MediatR/MicrosoftExtensionsDI/MediatRServiceCollectionExtensions.cs @@ -62,12 +62,8 @@ internal static void CheckLicense(this IServiceProvider serviceProvider) { if (LicenseChecked == false) { - var licenseAccessor = serviceProvider.GetService() ?? new LicenseAccessor( - serviceProvider.GetRequiredService(), - serviceProvider.GetRequiredService() - ); - var licenseValidator = serviceProvider.GetService() - ?? new LicenseValidator(serviceProvider.GetRequiredService()); + var licenseAccessor = serviceProvider.GetRequiredService(); + var licenseValidator = serviceProvider.GetRequiredService(); var license = licenseAccessor.Current; licenseValidator.Validate(license); diff --git a/src/MediatR/Registration/ServiceRegistrar.cs b/src/MediatR/Registration/ServiceRegistrar.cs index 8016fdb3..afded247 100644 --- a/src/MediatR/Registration/ServiceRegistrar.cs +++ b/src/MediatR/Registration/ServiceRegistrar.cs @@ -7,6 +7,7 @@ using MediatR.Pipeline; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging; namespace MediatR.Registration; @@ -470,8 +471,25 @@ public static void AddRequiredServices(IServiceCollection services, MediatRServi MediatRServiceCollectionExtensions.LicenseChecked = false; services.TryAddSingleton(serviceConfiguration); - services.TryAddSingleton(); - services.TryAddSingleton(); + services.TryAddSingleton(static sp => + { + var loggerFactory = sp.GetService() + ?? throw new InvalidOperationException( + "MediatR requires ILoggerFactory to be registered. " + + "Call services.AddLogging() before services.AddMediatR()."); + var config = sp.GetService(); + return config != null + ? new LicenseAccessor(config, loggerFactory) + : new LicenseAccessor(loggerFactory); + }); + services.TryAddSingleton(static sp => + { + var loggerFactory = sp.GetService() + ?? throw new InvalidOperationException( + "MediatR requires ILoggerFactory to be registered. " + + "Call services.AddLogging() before services.AddMediatR()."); + return new LicenseValidator(loggerFactory); + }); var notificationPublisherServiceDescriptor = serviceConfiguration.NotificationPublisherType != null ? new ServiceDescriptor(typeof(INotificationPublisher), serviceConfiguration.NotificationPublisherType, serviceConfiguration.Lifetime) diff --git a/test/MediatR.Tests/ServiceFactoryTests.cs b/test/MediatR.Tests/ServiceFactoryTests.cs index aaaf989d..801d1bdd 100644 --- a/test/MediatR.Tests/ServiceFactoryTests.cs +++ b/test/MediatR.Tests/ServiceFactoryTests.cs @@ -51,7 +51,10 @@ public void Should_not_throw_with_manual_registration() var services = new ServiceCollection(); services.AddFakeLogging(); services.AddTransient(); - services.AddSingleton(new MediatRServiceConfiguration()); + var config = new MediatRServiceConfiguration(); + services.AddSingleton(config); + services.AddSingleton(); + services.AddSingleton(); var container = services.BuildServiceProvider();