From d3a9ed78944f9102c81430e0d9ff5bf0cc7d74c3 Mon Sep 17 00:00:00 2001 From: Macocian Alexandru Victor Date: Fri, 11 Jun 2021 10:01:24 +0200 Subject: [PATCH] Ability to return all services of a specified type (#4) --- Slim.Tests/Models/ISharedInterface.cs | 6 +++++ Slim.Tests/Models/ISharedService1.cs | 6 +++++ Slim.Tests/Models/ISharedService2.cs | 6 +++++ Slim.Tests/Models/ISharedService3.cs | 6 +++++ Slim.Tests/Models/SharedService1.cs | 6 +++++ Slim.Tests/Models/SharedService2.cs | 6 +++++ Slim.Tests/Models/SharedService3.cs | 6 +++++ Slim.Tests/ServiceManagerTests.cs | 13 +++++++++++ Slim/IServiceManager.cs | 11 +++++++++ Slim/IServiceProvider.cs | 10 +-------- Slim/ServiceManager.cs | 27 +++++++++++++++++++++- Slim/Slim.csproj | 6 ++--- Slim/Slim.xml | 32 ++++++++++++++++++++------- 13 files changed, 120 insertions(+), 21 deletions(-) create mode 100644 Slim.Tests/Models/ISharedInterface.cs create mode 100644 Slim.Tests/Models/ISharedService1.cs create mode 100644 Slim.Tests/Models/ISharedService2.cs create mode 100644 Slim.Tests/Models/ISharedService3.cs create mode 100644 Slim.Tests/Models/SharedService1.cs create mode 100644 Slim.Tests/Models/SharedService2.cs create mode 100644 Slim.Tests/Models/SharedService3.cs diff --git a/Slim.Tests/Models/ISharedInterface.cs b/Slim.Tests/Models/ISharedInterface.cs new file mode 100644 index 0000000..9784ec4 --- /dev/null +++ b/Slim.Tests/Models/ISharedInterface.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public interface ISharedInterface + { + } +} diff --git a/Slim.Tests/Models/ISharedService1.cs b/Slim.Tests/Models/ISharedService1.cs new file mode 100644 index 0000000..3f6d485 --- /dev/null +++ b/Slim.Tests/Models/ISharedService1.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public interface ISharedService1 : ISharedInterface + { + } +} diff --git a/Slim.Tests/Models/ISharedService2.cs b/Slim.Tests/Models/ISharedService2.cs new file mode 100644 index 0000000..1d0b08c --- /dev/null +++ b/Slim.Tests/Models/ISharedService2.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public interface ISharedService2 : ISharedInterface + { + } +} diff --git a/Slim.Tests/Models/ISharedService3.cs b/Slim.Tests/Models/ISharedService3.cs new file mode 100644 index 0000000..b07896a --- /dev/null +++ b/Slim.Tests/Models/ISharedService3.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public interface ISharedService3 : ISharedInterface + { + } +} diff --git a/Slim.Tests/Models/SharedService1.cs b/Slim.Tests/Models/SharedService1.cs new file mode 100644 index 0000000..d8f6587 --- /dev/null +++ b/Slim.Tests/Models/SharedService1.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public sealed class SharedService1 : ISharedService1 + { + } +} diff --git a/Slim.Tests/Models/SharedService2.cs b/Slim.Tests/Models/SharedService2.cs new file mode 100644 index 0000000..d33eaa5 --- /dev/null +++ b/Slim.Tests/Models/SharedService2.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public sealed class SharedService2 : ISharedService2 + { + } +} diff --git a/Slim.Tests/Models/SharedService3.cs b/Slim.Tests/Models/SharedService3.cs new file mode 100644 index 0000000..9f31dbe --- /dev/null +++ b/Slim.Tests/Models/SharedService3.cs @@ -0,0 +1,6 @@ +namespace Slim.Tests.Models +{ + public sealed class SharedService3 : ISharedService3 + { + } +} diff --git a/Slim.Tests/ServiceManagerTests.cs b/Slim.Tests/ServiceManagerTests.cs index 2d7fe6e..76ea1a7 100644 --- a/Slim.Tests/ServiceManagerTests.cs +++ b/Slim.Tests/ServiceManagerTests.cs @@ -494,5 +494,18 @@ namespace Slim.Tests di.GetService(); called.Should().Be(1); } + + [TestMethod] + public void GetServicesReturnsAllServicesWithInterface() + { + var di = new ServiceManager(); + di.RegisterSingleton(); + di.RegisterSingleton(); + di.RegisterSingleton(); + di.RegisterSingleton(); + + di.GetServicesOfType().Should().HaveCount(3); + di.GetServicesOfType(typeof(ISharedInterface)).Should().HaveCount(3).And.AllBeAssignableTo(); + } } } diff --git a/Slim/IServiceManager.cs b/Slim/IServiceManager.cs index 80aa126..e991ebd 100644 --- a/Slim/IServiceManager.cs +++ b/Slim/IServiceManager.cs @@ -1,5 +1,6 @@ using Slim.Resolvers; using System; +using System.Collections.Generic; namespace Slim { @@ -8,6 +9,16 @@ namespace Slim /// public interface IServiceManager : IServiceProvider, IServiceProducer { + /// + /// Returns all services that can be cast to provided type. + /// + /// Type of the returned services. + public IEnumerable GetServicesOfType(); + /// + /// Returns all services that can be cast to provided type. + /// + /// Type of the returned services. + public IEnumerable GetServicesOfType(Type type); /// /// Register the current service manager as a valid dependency. /// diff --git a/Slim/IServiceProvider.cs b/Slim/IServiceProvider.cs index 14bbe6a..079aaf1 100644 --- a/Slim/IServiceProvider.cs +++ b/Slim/IServiceProvider.cs @@ -1,12 +1,11 @@ using Slim.Exceptions; -using System; namespace Slim { /// /// Interface allowing to request services from the . /// - public interface IServiceProvider + public interface IServiceProvider : System.IServiceProvider { /// /// Creates a scoped . @@ -20,12 +19,5 @@ namespace Slim /// Required service. /// Thrown when unable to resolve required service. TInterface GetService() where TInterface : class; - /// - /// Resolves and returns the required service. - /// - /// Type of required service. - /// Required service. - /// Thrown when unable to resolve required service. - object GetService(Type type); } } diff --git a/Slim/ServiceManager.cs b/Slim/ServiceManager.cs index 3ca22b0..e025833 100644 --- a/Slim/ServiceManager.cs +++ b/Slim/ServiceManager.cs @@ -371,7 +371,22 @@ namespace Slim { return this.PrepareAndGetService(type); } - + /// + /// Returns all services that can be cast to provided type. + /// + /// Type of the returned services. + public IEnumerable GetServicesOfType() + { + return this.EnumerateAndReturnServicesOfType(typeof(T)).OfType(); + } + /// + /// Returns all services that can be cast to provided type. + /// + /// Type of the returned services. + public IEnumerable GetServicesOfType(Type type) + { + return this.EnumerateAndReturnServicesOfType(type); + } /// /// Marks a type of exception to be caught and handled. /// @@ -422,6 +437,16 @@ namespace Slim this.Resolvers.Add(dependencyResolver); } + private IEnumerable 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) diff --git a/Slim/Slim.csproj b/Slim/Slim.csproj index 0a67fae..d5a0160 100644 --- a/Slim/Slim.csproj +++ b/Slim/Slim.csproj @@ -8,10 +8,10 @@ Service lifetime management and dependency injection framework. - 1.4.3.0 - 1.4.3.0 + 1.5.0 + 1.5.0 https://github.com/AlexMacocian/Slim - 1.4.3 + 1.5 true true LICENSE diff --git a/Slim/Slim.xml b/Slim/Slim.xml index 30c954b..4b7d02d 100644 --- a/Slim/Slim.xml +++ b/Slim/Slim.xml @@ -39,6 +39,18 @@ Interface for . + + + Returns all services that can be cast to provided type. + + Type of the returned services. + + + + Returns all services that can be cast to provided type. + + Type of the returned services. + Register the current service manager as a valid dependency. @@ -313,14 +325,6 @@ Required service. Thrown when unable to resolve required service. - - - Resolves and returns the required service. - - Type of required service. - Required service. - Thrown when unable to resolve required service. - Resolver that can be added to a to manually resolve a dependency. @@ -595,6 +599,18 @@ Required service. Thrown when unable to resolve required service. + + + Returns all services that can be cast to provided type. + + Type of the returned services. + + + + Returns all services that can be cast to provided type. + + Type of the returned services. + Marks a type of exception to be caught and handled.