diff --git a/Slim.Tests/ServiceManagerTests.cs b/Slim.Tests/ServiceManagerTests.cs index e0a6f3b..e3188bd 100644 --- a/Slim.Tests/ServiceManagerTests.cs +++ b/Slim.Tests/ServiceManagerTests.cs @@ -257,7 +257,6 @@ public class ServiceManagerTests public void RegisterServiceManagerSingletonRegistersCurrentServiceManager() { var di = new ServiceManager(); - di.RegisterServiceManager(); di.RegisterSingleton(); var dependentService = di.GetService(); @@ -811,4 +810,21 @@ public class ServiceManagerTests serviceManager.ParentServiceManager.Should().BeNull(); } + + [TestMethod] + public void ScopedServiceManager_PassesThemselvesAsDependency() + { + var di = new ServiceManager(); + di.RegisterScoped(); + var scopedDi = di.CreateScope(); + + var dependentService1 = di.GetService(); + var dependentService2 = scopedDi.GetService(); + + dependentService1.ServiceManager.Should().NotBe(dependentService2.ServiceManager); + dependentService1.ServiceProducer.Should().NotBe(dependentService2.ServiceProducer); + dependentService1.ServiceProvider.Should().NotBe(dependentService2.ServiceProvider); + dependentService1.ServiceManager.Should().Be(di); + dependentService2.ServiceManager.Should().Be(scopedDi); + } } diff --git a/Slim/IServiceProducer.cs b/Slim/IServiceProducer.cs index d2a6e8e..6b90365 100644 --- a/Slim/IServiceProducer.cs +++ b/Slim/IServiceProducer.cs @@ -8,11 +8,6 @@ namespace Slim; /// public interface IServiceProducer { - /// - /// Register the current service manager as a valid dependency. - /// - /// Registers current service manager as , , , . - void RegisterServiceManager(); /// /// Returns true if there exists a registration for . /// diff --git a/Slim/ServiceManager.cs b/Slim/ServiceManager.cs index 4503848..1ab32d0 100644 --- a/Slim/ServiceManager.cs +++ b/Slim/ServiceManager.cs @@ -413,18 +413,6 @@ public sealed class ServiceManager : IServiceManager this.RegisterService(tClass, Lifetime.Scoped, null, serviceFactory, registerAllInterfaces: registerAllInterfaces); } - /// - /// Register the current service manager as a valid dependency. - /// - /// Registers current service manager as , , , . - public void RegisterServiceManager() - { - this.RegisterSingleton(sp => this); - this.RegisterSingleton(sp => this); - this.RegisterSingleton(sp => this); - this.RegisterSingleton(sp => this); - } - /// /// Creates a scoped . /// @@ -620,6 +608,11 @@ public sealed class ServiceManager : IServiceManager { return this.TryFunc(() => { + if (IsServiceManagerDependency(tinterface)) + { + return true; + } + lock (this) { if (this.Resolvers.Any(resolver => resolver.CanResolve(tinterface))) @@ -633,6 +626,11 @@ public sealed class ServiceManager : IServiceManager } private object GetObject(Type tInterface) { + if (IsServiceManagerDependency(tInterface)) + { + return this; + } + if (!this.InterfaceMapping.TryGetValue(tInterface, out var mappingTuple) && this.Resolvers.Any(resolver => resolver.CanResolve(tInterface)) is false) { @@ -723,6 +721,12 @@ public sealed class ServiceManager : IServiceManager var parameterImplementationList = new List(); foreach (var par in parameterInfos) { + if (IsServiceManagerDependency(par.ParameterType)) + { + parameterImplementationList.Add(this); + continue; + } + if (!this.InterfaceMapping.TryGetValue(par.ParameterType, out var mappingTuple)) { object resolvedParam = null; @@ -910,4 +914,13 @@ public sealed class ServiceManager : IServiceManager this.disposedValue = true; } } + + private static bool IsServiceManagerDependency(Type type) + { + return type == typeof(IServiceManager) || + type == typeof(IServiceProducer) || + type == typeof(IServiceProvider) || + type == typeof(ServiceManager) || + type == typeof(System.IServiceProvider); + } } diff --git a/Slim/Slim.csproj b/Slim/Slim.csproj index 23339aa..e8195cd 100644 --- a/Slim/Slim.csproj +++ b/Slim/Slim.csproj @@ -8,10 +8,10 @@ Service lifetime management and dependency injection framework. - 1.9 - 1.9 + 1.9.1 + 1.9.1 https://github.com/AlexMacocian/Slim - 1.9 + 1.9.1 true true LICENSE diff --git a/Slim/Slim.xml b/Slim/Slim.xml index b3100d3..270a55f 100644 --- a/Slim/Slim.xml +++ b/Slim/Slim.xml @@ -101,12 +101,6 @@ Interface allowing to produce services for the . - - - Register the current service manager as a valid dependency. - - Registers current service manager as , , , . - Returns true if there exists a registration for . @@ -673,12 +667,6 @@ Thrown when the provided serviceFactory is null. Thrown when contains an entry for the provided interface type. - - - Register the current service manager as a valid dependency. - - Registers current service manager as , , , . - Creates a scoped .