mirror of
https://github.com/AlexMacocian/Slim.git
synced 2026-07-15 15:19:59 +00:00
Ability to return all services of a specified type (#4)
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public interface ISharedInterface
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public interface ISharedService1 : ISharedInterface
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public interface ISharedService2 : ISharedInterface
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public interface ISharedService3 : ISharedInterface
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public sealed class SharedService1 : ISharedService1
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public sealed class SharedService2 : ISharedService2
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Slim.Tests.Models
|
||||
{
|
||||
public sealed class SharedService3 : ISharedService3
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,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
@@ -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
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user