From 1c3f837f41e23da567dd33da4d1cd42274df276f Mon Sep 17 00:00:00 2001 From: Macocian Alexandru Victor Date: Fri, 9 Sep 2022 16:46:30 +0200 Subject: [PATCH] Add support for IServiceProviderIsService (#23) --- .../ServiceCollectionExtensionsTests.cs | 25 +++++++++++++++++++ .../ServiceCollectionExtensions.cs | 8 +++++- .../SlimServiceProviderIsService.cs | 19 ++++++++++++++ .../{ServiceScope.cs => SlimServiceScope.cs} | 2 +- ...eFactory.cs => SlimServiceScopeFactory.cs} | 6 ++--- Slim.Integration/Slim.Integration.csproj | 6 ++--- 6 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 Slim.Integration/ServiceCollection/SlimServiceProviderIsService.cs rename Slim.Integration/ServiceCollection/{ServiceScope.cs => SlimServiceScope.cs} (85%) rename Slim.Integration/ServiceCollection/{ServiceScopeFactory.cs => SlimServiceScopeFactory.cs} (67%) diff --git a/Slim.Integration.Tests/ServiceCollectionExtensionsTests.cs b/Slim.Integration.Tests/ServiceCollectionExtensionsTests.cs index dbbdd25..68cb8cf 100644 --- a/Slim.Integration.Tests/ServiceCollectionExtensionsTests.cs +++ b/Slim.Integration.Tests/ServiceCollectionExtensionsTests.cs @@ -142,4 +142,29 @@ public sealed class ServiceCollectionExtensionsTests serviceProvider.Should().BeOfType(); scopedServiceProvider.As().ParentServiceManager.Should().Be(serviceProvider); } + + [TestMethod] + public void BuildSlimServiceProvider_SupportsSlimServiceProviderIsService_ReturnsTrueForRegisteredService() + { + var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); + ServiceCollectionServiceExtensions.AddTransient(serviceCollection); + var serviceProvider = serviceCollection.BuildSlimServiceProvider(); + + var isServiceApi = serviceProvider.GetRequiredService(); + + isServiceApi.IsService(typeof(ITestService)).Should().BeTrue(); + } + + [TestMethod] + public void BuildSlimServiceProvider_SupportsSlimServiceProviderIsService_ReturnsFalseForRegisteredService() + { + var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); + ServiceCollectionServiceExtensions.AddTransient(serviceCollection); + var serviceProvider = serviceCollection.BuildSlimServiceProvider(); + + var isServiceApi = serviceProvider.GetRequiredService(); + + isServiceApi.IsService(typeof(TestService)).Should().BeFalse(); + isServiceApi.IsService(typeof(object)).Should().BeFalse(); + } } diff --git a/Slim.Integration/ServiceCollection/ServiceCollectionExtensions.cs b/Slim.Integration/ServiceCollection/ServiceCollectionExtensions.cs index 87513f3..c45cde5 100644 --- a/Slim.Integration/ServiceCollection/ServiceCollectionExtensions.cs +++ b/Slim.Integration/ServiceCollection/ServiceCollectionExtensions.cs @@ -25,10 +25,16 @@ public static class ServiceCollectionExtensions } } - serviceManager.RegisterScoped(); + RegisterServiceProviderDependencies(serviceManager); return serviceManager; } + private static void RegisterServiceProviderDependencies(IServiceManager serviceManager) + { + serviceManager.RegisterScoped(); + serviceManager.RegisterScoped(); + } + private static void RegisterSingleton(ServiceManager serviceManager, ServiceDescriptor serviceDescriptor) { if (serviceDescriptor.ImplementationInstance is null && diff --git a/Slim.Integration/ServiceCollection/SlimServiceProviderIsService.cs b/Slim.Integration/ServiceCollection/SlimServiceProviderIsService.cs new file mode 100644 index 0000000..5495196 --- /dev/null +++ b/Slim.Integration/ServiceCollection/SlimServiceProviderIsService.cs @@ -0,0 +1,19 @@ +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace Slim.Integration.ServiceCollection; + +internal sealed class SlimServiceProviderIsService : IServiceProviderIsService +{ + private readonly IServiceManager serviceManager; + + public SlimServiceProviderIsService(IServiceManager serviceManager) + { + this.serviceManager = serviceManager; + } + + public bool IsService(Type serviceType) + { + return this.serviceManager.IsRegistered(serviceType); + } +} diff --git a/Slim.Integration/ServiceCollection/ServiceScope.cs b/Slim.Integration/ServiceCollection/SlimServiceScope.cs similarity index 85% rename from Slim.Integration/ServiceCollection/ServiceScope.cs rename to Slim.Integration/ServiceCollection/SlimServiceScope.cs index 9d23783..279e577 100644 --- a/Slim.Integration/ServiceCollection/ServiceScope.cs +++ b/Slim.Integration/ServiceCollection/SlimServiceScope.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.DependencyInjection; namespace Slim.Integration.ServiceCollection; -public sealed class ServiceScope : IServiceScope +internal sealed class SlimServiceScope : IServiceScope { public System.IServiceProvider ServiceProvider { get; set; } diff --git a/Slim.Integration/ServiceCollection/ServiceScopeFactory.cs b/Slim.Integration/ServiceCollection/SlimServiceScopeFactory.cs similarity index 67% rename from Slim.Integration/ServiceCollection/ServiceScopeFactory.cs rename to Slim.Integration/ServiceCollection/SlimServiceScopeFactory.cs index 20d5970..63368b6 100644 --- a/Slim.Integration/ServiceCollection/ServiceScopeFactory.cs +++ b/Slim.Integration/ServiceCollection/SlimServiceScopeFactory.cs @@ -2,11 +2,11 @@ namespace Slim.Integration.ServiceCollection; -public sealed class ServiceScopeFactory : IServiceScopeFactory +internal sealed class SlimServiceScopeFactory : IServiceScopeFactory { private readonly IServiceManager serviceManager; - public ServiceScopeFactory( + public SlimServiceScopeFactory( IServiceManager serviceManager) { this.serviceManager = serviceManager; @@ -15,6 +15,6 @@ public sealed class ServiceScopeFactory : IServiceScopeFactory public IServiceScope CreateScope() { IServiceProvider scopedServiceManager = this.serviceManager.CreateScope(); - return new ServiceScope { ServiceProvider = scopedServiceManager }; + return new SlimServiceScope { ServiceProvider = scopedServiceManager }; } } diff --git a/Slim.Integration/Slim.Integration.csproj b/Slim.Integration/Slim.Integration.csproj index 8dd671d..1e571a2 100644 --- a/Slim.Integration/Slim.Integration.csproj +++ b/Slim.Integration/Slim.Integration.csproj @@ -8,10 +8,10 @@ Integration with Microsoft.DependencyInjection library. - 1.0.0 - 1.0.0 + 1.0.1 + 1.0.1 https://github.com/AlexMacocian/Slim - 1.0.0 + 1.0.1 true true LICENSE