Add support for IServiceProvider.GetServices (#24)

This commit is contained in:
2022-09-09 18:33:47 +02:00
committed by GitHub
parent 1c3f837f41
commit bfeb8b8e25
5 changed files with 71 additions and 3 deletions
@@ -0,0 +1,4 @@
namespace Slim.Integration.Tests.Models;
public sealed class TestService2 : ITestService
{
}
@@ -167,4 +167,28 @@ public sealed class ServiceCollectionExtensionsTests
isServiceApi.IsService(typeof(TestService)).Should().BeFalse();
isServiceApi.IsService(typeof(object)).Should().BeFalse();
}
[TestMethod]
public void BuildSlimServiceProvider_GetServices_ReturnsExpectedServices()
{
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
ServiceCollectionServiceExtensions.AddTransient<TestService>(serviceCollection);
ServiceCollectionServiceExtensions.AddTransient<TestService2>(serviceCollection);
var serviceProvider = serviceCollection.BuildSlimServiceProvider();
var services = serviceProvider.GetServices<ITestService>();
services.Should().HaveCount(2);
}
[TestMethod]
public void BuildSlimServiceProvider_GetServicesNoServices_ReturnsNoServices()
{
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
var serviceProvider = serviceCollection.BuildSlimServiceProvider();
var services = serviceProvider.GetServices<ITestService>();
services.Should().HaveCount(0);
}
}
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Slim.Resolvers;
namespace Slim.Integration.ServiceCollection;
internal sealed class IEnumerableResolver : IDependencyResolver
{
private static readonly Type EnumerableType = typeof(IEnumerable<>);
public bool CanResolve(Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == EnumerableType)
{
return true;
}
return false;
}
public object Resolve(IServiceProvider serviceProvider, Type type)
{
var genericArgumentType = type.GetGenericArguments().FirstOrDefault();
if (genericArgumentType is null)
{
throw new InvalidOperationException($"Unable to resolve {type.Name}");
}
var list = serviceProvider.GetServicesOfType(genericArgumentType).ToArray();
// Dynamically invoke IEnumerable.Cast to create an IEnumerable<type>
var enumerable = typeof(Enumerable)
.GetMethod("Cast", new[] { typeof(System.Collections.IEnumerable) })
.MakeGenericMethod(genericArgumentType)
.Invoke(null, new object[] { list });
return enumerable;
}
}
@@ -31,6 +31,7 @@ public static class ServiceCollectionExtensions
private static void RegisterServiceProviderDependencies(IServiceManager serviceManager)
{
serviceManager.RegisterResolver(new IEnumerableResolver());
serviceManager.RegisterScoped<IServiceScopeFactory, SlimServiceScopeFactory>();
serviceManager.RegisterScoped<IServiceProviderIsService, SlimServiceProviderIsService>();
}
+3 -3
View File
@@ -8,10 +8,10 @@
<Company />
<Product></Product>
<Description>Integration with Microsoft.DependencyInjection library.</Description>
<AssemblyVersion>1.0.1</AssemblyVersion>
<FileVersion>1.0.1</FileVersion>
<AssemblyVersion>1.0.2</AssemblyVersion>
<FileVersion>1.0.2</FileVersion>
<PackageProjectUrl>https://github.com/AlexMacocian/Slim</PackageProjectUrl>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageLicenseFile>LICENSE</PackageLicenseFile>