Ability to return all services of a specified type (#4)

This commit is contained in:
2021-06-11 10:01:24 +02:00
committed by GitHub
parent d80d3aaa67
commit d3a9ed7894
13 changed files with 120 additions and 21 deletions
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public interface ISharedInterface
{
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public interface ISharedService1 : ISharedInterface
{
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public interface ISharedService2 : ISharedInterface
{
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public interface ISharedService3 : ISharedInterface
{
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public sealed class SharedService1 : ISharedService1
{
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public sealed class SharedService2 : ISharedService2
{
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Slim.Tests.Models
{
public sealed class SharedService3 : ISharedService3
{
}
}
+13
View File
@@ -494,5 +494,18 @@ namespace Slim.Tests
di.GetService<IIndependentService>();
called.Should().Be(1);
}
[TestMethod]
public void GetServicesReturnsAllServicesWithInterface()
{
var di = new ServiceManager();
di.RegisterSingleton<IIndependentService, IndependentService>();
di.RegisterSingleton<ISharedService1, SharedService1>();
di.RegisterSingleton<ISharedService2, SharedService2>();
di.RegisterSingleton<ISharedService3, SharedService3>();
di.GetServicesOfType<ISharedInterface>().Should().HaveCount(3);
di.GetServicesOfType(typeof(ISharedInterface)).Should().HaveCount(3).And.AllBeAssignableTo<ISharedInterface>();
}
}
}
+11
View File
@@ -1,5 +1,6 @@
using Slim.Resolvers;
using System;
using System.Collections.Generic;
namespace Slim
{
@@ -8,6 +9,16 @@ namespace Slim
/// </summary>
public interface IServiceManager : IServiceProvider, IServiceProducer
{
/// <summary>
/// Returns all services that can be cast to provided type.
/// </summary>
/// <typeparam name="T">Type of the returned services.</typeparam>
public IEnumerable<T> GetServicesOfType<T>();
/// <summary>
/// Returns all services that can be cast to provided type.
/// </summary>
/// <param name="type">Type of the returned services.</param>
public IEnumerable<object> GetServicesOfType(Type type);
/// <summary>
/// Register the current service manager as a valid dependency.
/// </summary>
+1 -9
View File
@@ -1,12 +1,11 @@
using Slim.Exceptions;
using System;
namespace Slim
{
/// <summary>
/// Interface allowing to request services from the <see cref="ServiceManager"/>.
/// </summary>
public interface IServiceProvider
public interface IServiceProvider : System.IServiceProvider
{
/// <summary>
/// Creates a scoped <see cref="IServiceProvider"/>.
@@ -20,12 +19,5 @@ namespace Slim
/// <returns>Required service.</returns>
/// <exception cref="DependencyInjectionException">Thrown when unable to resolve required service.</exception>
TInterface GetService<TInterface>() where TInterface : class;
/// <summary>
/// Resolves and returns the required service.
/// </summary>
/// <param name="type">Type of required service.</param>
/// <returns>Required service.</returns>
/// <exception cref="DependencyInjectionException">Thrown when unable to resolve required service.</exception>
object GetService(Type type);
}
}
+26 -1
View File
@@ -371,7 +371,22 @@ namespace Slim
{
return this.PrepareAndGetService(type);
}
/// <summary>
/// Returns all services that can be cast to provided type.
/// </summary>
/// <typeparam name="T">Type of the returned services.</typeparam>
public IEnumerable<T> GetServicesOfType<T>()
{
return this.EnumerateAndReturnServicesOfType(typeof(T)).OfType<T>();
}
/// <summary>
/// Returns all services that can be cast to provided type.
/// </summary>
/// <param name="type">Type of the returned services.</param>
public IEnumerable<object> GetServicesOfType(Type type)
{
return this.EnumerateAndReturnServicesOfType(type);
}
/// <summary>
/// Marks a type of exception to be caught and handled.
/// </summary>
@@ -422,6 +437,16 @@ namespace Slim
this.Resolvers.Add(dependencyResolver);
}
private IEnumerable<object> EnumerateAndReturnServicesOfType(Type type)
{
foreach(var interf in this.InterfaceMapping.Keys)
{
if (type.IsAssignableFrom(interf))
{
yield return this.PrepareAndGetService(interf);
}
}
}
private void RegisterService(Type tClass, Lifetime lifetime, Type tInterface = null, Delegate serviceFactory = null)
{
if (tInterface is not null)
+3 -3
View File
@@ -8,10 +8,10 @@
<Company />
<Product></Product>
<Description>Service lifetime management and dependency injection framework.</Description>
<AssemblyVersion>1.4.3.0</AssemblyVersion>
<FileVersion>1.4.3.0</FileVersion>
<AssemblyVersion>1.5.0</AssemblyVersion>
<FileVersion>1.5.0</FileVersion>
<PackageProjectUrl>https://github.com/AlexMacocian/Slim</PackageProjectUrl>
<Version>1.4.3</Version>
<Version>1.5</Version>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
+24 -8
View File
@@ -39,6 +39,18 @@
Interface for <see cref="T:Slim.ServiceManager"/>.
</summary>
</member>
<member name="M:Slim.IServiceManager.GetServicesOfType``1">
<summary>
Returns all services that can be cast to provided type.
</summary>
<typeparam name="T">Type of the returned services.</typeparam>
</member>
<member name="M:Slim.IServiceManager.GetServicesOfType(System.Type)">
<summary>
Returns all services that can be cast to provided type.
</summary>
<param name="type">Type of the returned services.</param>
</member>
<member name="M:Slim.IServiceManager.RegisterServiceManager">
<summary>
Register the current service manager as a valid dependency.
@@ -313,14 +325,6 @@
<returns>Required service.</returns>
<exception cref="T:Slim.Exceptions.DependencyInjectionException">Thrown when unable to resolve required service.</exception>
</member>
<member name="M:Slim.IServiceProvider.GetService(System.Type)">
<summary>
Resolves and returns the required service.
</summary>
<param name="type">Type of required service.</param>
<returns>Required service.</returns>
<exception cref="T:Slim.Exceptions.DependencyInjectionException">Thrown when unable to resolve required service.</exception>
</member>
<member name="T:Slim.Resolvers.IDependencyResolver">
<summary>
Resolver that can be added to a <see cref="T:Slim.IServiceManager"/> to manually resolve a dependency.
@@ -595,6 +599,18 @@
<returns>Required service.</returns>
<exception cref="T:Slim.Exceptions.DependencyInjectionException">Thrown when unable to resolve required service.</exception>
</member>
<member name="M:Slim.ServiceManager.GetServicesOfType``1">
<summary>
Returns all services that can be cast to provided type.
</summary>
<typeparam name="T">Type of the returned services.</typeparam>
</member>
<member name="M:Slim.ServiceManager.GetServicesOfType(System.Type)">
<summary>
Returns all services that can be cast to provided type.
</summary>
<param name="type">Type of the returned services.</param>
</member>
<member name="M:Slim.ServiceManager.HandleException``1(System.Func{Slim.IServiceProvider,``0,System.Boolean})">
<summary>
Marks a type of exception to be caught and handled.