diff --git a/src/ServiceProviderValidationExtensions.Hosting/HostBuilderExtensions.cs b/src/ServiceProviderValidationExtensions.Hosting/HostBuilderExtensions.cs index 312d7a3..fc2838a 100644 --- a/src/ServiceProviderValidationExtensions.Hosting/HostBuilderExtensions.cs +++ b/src/ServiceProviderValidationExtensions.Hosting/HostBuilderExtensions.cs @@ -12,9 +12,9 @@ public static IHostBuilder UseServiceProviderExtendedValidation(this IHostBuilde return hostBuilder; } - public static IHostBuilder UseServiceProviderExtendedValidation(this IHostBuilder hostBuilder, Action configureReporting) + public static IHostBuilder UseServiceProviderExtendedValidation(this IHostBuilder hostBuilder, Action configureReporting) { - var reportingBuilder = new ReportingBuilder(); + var reportingBuilder = new ReportConfigurer(); configureReporting(reportingBuilder); hostBuilder.UseServiceProviderFactory(new ExtendedValidationServiceProviderFactory(new DefaultServiceProviderFactory(), reportingBuilder)); return hostBuilder; @@ -28,10 +28,10 @@ public static HostApplicationBuilder ConfigureContainerWithServiceProviderExtend } public static HostApplicationBuilder ConfigureContainerWithServiceProviderExtendedValidation(this HostApplicationBuilder hostApplicationBuilder, - Action configureReporting, + Action configureReporting, Action? configure = null) { - var reportingBuilder = new ReportingBuilder(); + var reportingBuilder = new ReportConfigurer(); configureReporting(reportingBuilder); hostApplicationBuilder.ConfigureContainer(new ExtendedValidationServiceProviderFactory(new DefaultServiceProviderFactory(), reportingBuilder), configure); return hostApplicationBuilder; diff --git a/src/ServiceProviderValidationExtensions.Hosting/Internal/ExtendedValidationServiceProviderFactory.cs b/src/ServiceProviderValidationExtensions.Hosting/Internal/ExtendedValidationServiceProviderFactory.cs index 95f86e5..baaae7d 100644 --- a/src/ServiceProviderValidationExtensions.Hosting/Internal/ExtendedValidationServiceProviderFactory.cs +++ b/src/ServiceProviderValidationExtensions.Hosting/Internal/ExtendedValidationServiceProviderFactory.cs @@ -5,9 +5,9 @@ namespace ServiceProviderValidationExtensions.Hosting.Internal; internal sealed class ExtendedValidationServiceProviderFactory : IServiceProviderFactory { private readonly DefaultServiceProviderFactory _defaultServiceProviderFactory; - private readonly ReportingBuilder? _reportingBuilder; + private readonly ReportConfigurer? _reportingBuilder; - public ExtendedValidationServiceProviderFactory(DefaultServiceProviderFactory defaultServiceProviderFactory, ReportingBuilder? reportingBuilder) + public ExtendedValidationServiceProviderFactory(DefaultServiceProviderFactory defaultServiceProviderFactory, ReportConfigurer? reportingBuilder) { _defaultServiceProviderFactory = defaultServiceProviderFactory; _reportingBuilder = reportingBuilder; diff --git a/src/ServiceProviderValidationExtensions/IReportingBuilder.cs b/src/ServiceProviderValidationExtensions/IReportConfigurer.cs similarity index 81% rename from src/ServiceProviderValidationExtensions/IReportingBuilder.cs rename to src/ServiceProviderValidationExtensions/IReportConfigurer.cs index de496c0..2bf8f8f 100644 --- a/src/ServiceProviderValidationExtensions/IReportingBuilder.cs +++ b/src/ServiceProviderValidationExtensions/IReportConfigurer.cs @@ -2,7 +2,7 @@ namespace ServiceProviderValidationExtensions; -public interface IReportingBuilder +public interface IReportConfigurer { void Report(IServiceCollection serviceCollection); } diff --git a/src/ServiceProviderValidationExtensions/ReportingBuilder.cs b/src/ServiceProviderValidationExtensions/ReportConfigurer.cs similarity index 69% rename from src/ServiceProviderValidationExtensions/ReportingBuilder.cs rename to src/ServiceProviderValidationExtensions/ReportConfigurer.cs index 7cfb5d0..802635d 100644 --- a/src/ServiceProviderValidationExtensions/ReportingBuilder.cs +++ b/src/ServiceProviderValidationExtensions/ReportConfigurer.cs @@ -3,15 +3,15 @@ namespace ServiceProviderValidationExtensions; -public sealed class ReportingBuilder : IReportingBuilder +public sealed class ReportConfigurer : IReportConfigurer { - private readonly IList> _duplicateServiceActions = new List>(); + private Action? _duplicateServiceAction; private readonly IList _duplicateServiceExclusions = new List(); - public ReportingBuilder OnDuplicateService(Action action, + public ReportConfigurer OnDuplicateService(Action action, Action? configuration = null) { - _duplicateServiceActions.Add(action); + _duplicateServiceAction = action; if (configuration is not null) { configuration(new ReportingBuilderDuplicateServiceConfiguration(this)); @@ -22,22 +22,22 @@ public ReportingBuilder OnDuplicateService(Action actio public sealed class ReportingBuilderDuplicateServiceConfiguration { - private readonly ReportingBuilder _reportingBuilder; + private readonly ReportConfigurer _reportConfigurer; - internal ReportingBuilderDuplicateServiceConfiguration(ReportingBuilder reportingBuilder) + internal ReportingBuilderDuplicateServiceConfiguration(ReportConfigurer reportConfigurer) { - _reportingBuilder = reportingBuilder; + _reportConfigurer = reportConfigurer; } public ReportingBuilderDuplicateServiceConfiguration Except() { - _reportingBuilder._duplicateServiceExclusions.Add(typeof(T)); + _reportConfigurer._duplicateServiceExclusions.Add(typeof(T)); return this; } public ReportingBuilderDuplicateServiceConfiguration Except(Type type) { - _reportingBuilder._duplicateServiceExclusions.Add(type); + _reportConfigurer._duplicateServiceExclusions.Add(type); return this; } } @@ -49,7 +49,7 @@ public void Report(IServiceCollection serviceCollection) private void ReportDuplicateServices(IServiceCollection serviceCollection) { - if (!_duplicateServiceActions.Any()) + if (_duplicateServiceAction is null) { return; } @@ -64,12 +64,14 @@ private void ReportDuplicateServices(IServiceCollection serviceCollection) return false; } - if (duplicateServiceExclusion.IsGenericType) + if (!duplicateServiceExclusion.IsGenericType) { - if (sd.ServiceType.IsDerivedFromGenericParent(duplicateServiceExclusion)) - { - return false; - } + continue; + } + + if (sd.ServiceType.IsDerivedFromGenericParent(duplicateServiceExclusion)) + { + return false; } } @@ -84,10 +86,8 @@ private void ReportDuplicateServices(IServiceCollection serviceCollection) .Select(t => new TypeInfo(t)) .ToList(); - foreach (var action in _duplicateServiceActions) - { - action(new DuplicateServiceContent(new TypeInfo(groupItem.Key), implementationTypes)); - } + var duplicateServiceContent = new DuplicateServiceContent(new TypeInfo(groupItem.Key), implementationTypes); + _duplicateServiceAction(duplicateServiceContent); } } diff --git a/src/ServiceProviderValidationExtensions/ServiceCollectionValidationExtensions.cs b/src/ServiceProviderValidationExtensions/ServiceCollectionValidationExtensions.cs index 1ac681f..fde584d 100644 --- a/src/ServiceProviderValidationExtensions/ServiceCollectionValidationExtensions.cs +++ b/src/ServiceProviderValidationExtensions/ServiceCollectionValidationExtensions.cs @@ -126,18 +126,18 @@ public static IServiceCollection AddTransient(this IS return services; } - public static ServiceProvider BuildServiceProviderWithValidation(this IServiceCollection serviceCollection, IReportingBuilder? reportingBuilder = null) + public static ServiceProvider BuildServiceProviderWithValidation(this IServiceCollection serviceCollection, IReportConfigurer? reportingBuilder = null) { var serviceProvider = ReportAndBuildAndValidate(serviceCollection, reportingBuilder, null); return serviceProvider; } - public static ServiceProvider BuildServiceProviderWithValidation(this IServiceCollection serviceCollection, ServiceProviderOptions options, ReportingBuilder? reportingBuilder = null) + public static ServiceProvider BuildServiceProviderWithValidation(this IServiceCollection serviceCollection, ServiceProviderOptions options, ReportConfigurer? reportingBuilder = null) { return ReportAndBuildAndValidate(serviceCollection, reportingBuilder, options); } - internal static ServiceProvider ReportAndBuildAndValidate(IServiceCollection serviceCollection, IReportingBuilder? reportingBuilder, ServiceProviderOptions? options) + internal static ServiceProvider ReportAndBuildAndValidate(IServiceCollection serviceCollection, IReportConfigurer? reportingBuilder, ServiceProviderOptions? options) { if (reportingBuilder is not null) { diff --git a/tests/Hosting/HostFullReportingTests.cs b/tests/Hosting/HostFullReportingTests.cs index 1c95b65..1bc951b 100644 --- a/tests/Hosting/HostFullReportingTests.cs +++ b/tests/Hosting/HostFullReportingTests.cs @@ -14,7 +14,7 @@ public void DefaultBuilder() { var duplicateServiceReports = new List(); - void ConfigureReporting(ReportingBuilder rb) + void ConfigureReporting(ReportConfigurer rb) { rb.OnDuplicateService(dsc => duplicateServiceReports.Add($"{dsc.ServiceType.DisplayName} is registered {dsc.ImplementationTypes.Count} times"), c => c.Except(typeof(IConfigureOptions<>)) diff --git a/tests/ReportingTests.cs b/tests/ReportingTests.cs index e65d43b..a61454b 100644 --- a/tests/ReportingTests.cs +++ b/tests/ReportingTests.cs @@ -16,7 +16,7 @@ public void ServiceRegisteredTwice() var duplicateServiceOutput = new List(); - var reportingBuilder = new ReportingBuilder().OnDuplicateService(ds => duplicateServiceOutput.Add( + var reportingBuilder = new ReportConfigurer().OnDuplicateService(ds => duplicateServiceOutput.Add( $"{ds.ServiceType.DisplayName} is registered {ds.ImplementationTypes.Count} times")); serviceCollection.BuildServiceProviderWithValidation(reportingBuilder); @@ -34,7 +34,7 @@ public void ServiceRegisteredTwiceOnceUsingLambda() var duplicateServiceOutput = new List(); - var reportingBuilder = new ReportingBuilder().OnDuplicateService(ds => duplicateServiceOutput.Add( + var reportingBuilder = new ReportConfigurer().OnDuplicateService(ds => duplicateServiceOutput.Add( $"{ds.ServiceType.DisplayName} is registered {ds.ImplementationTypes.Count} times")); serviceCollection.BuildServiceProviderWithValidation(reportingBuilder);