mirror of
https://github.com/AlexMacocian/Slim.git
synced 2026-07-15 15:19:59 +00:00
Add support for IServiceProvider.GetServices (#24)
This commit is contained in:
@@ -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>();
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user