Hardcode servicemanager registration (#19)

This commit is contained in:
2022-09-09 13:33:43 +02:00
committed by GitHub
parent 820b1c9c2e
commit b337497de5
5 changed files with 45 additions and 33 deletions
+17 -1
View File
@@ -257,7 +257,6 @@ public class ServiceManagerTests
public void RegisterServiceManagerSingletonRegistersCurrentServiceManager()
{
var di = new ServiceManager();
di.RegisterServiceManager();
di.RegisterSingleton<IDependentOnServiceManagerService, DependentOnServiceManagerService>();
var dependentService = di.GetService<IDependentOnServiceManagerService>();
@@ -811,4 +810,21 @@ public class ServiceManagerTests
serviceManager.ParentServiceManager.Should().BeNull();
}
[TestMethod]
public void ScopedServiceManager_PassesThemselvesAsDependency()
{
var di = new ServiceManager();
di.RegisterScoped<IDependentOnServiceManagerService, DependentOnServiceManagerService>();
var scopedDi = di.CreateScope();
var dependentService1 = di.GetService<IDependentOnServiceManagerService>();
var dependentService2 = scopedDi.GetService<IDependentOnServiceManagerService>();
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);
}
}
-5
View File
@@ -8,11 +8,6 @@ namespace Slim;
/// </summary>
public interface IServiceProducer
{
/// <summary>
/// Register the current service manager as a valid dependency.
/// </summary>
/// <remarks>Registers current service manager as <see cref="ServiceManager"/>, <see cref="IServiceManager"/>, <see cref="IServiceProducer"/>, <see cref="IServiceProvider"/>.</remarks>
void RegisterServiceManager();
/// <summary>
/// Returns true if there exists a registration for <paramref name="tInterface"/>.
/// </summary>
+25 -12
View File
@@ -413,18 +413,6 @@ public sealed class ServiceManager : IServiceManager
this.RegisterService(tClass, Lifetime.Scoped, null, serviceFactory, registerAllInterfaces: registerAllInterfaces);
}
/// <summary>
/// Register the current service manager as a valid dependency.
/// </summary>
/// <remarks>Registers current service manager as <see cref="ServiceManager"/>, <see cref="IServiceManager"/>, <see cref="IServiceProducer"/>, <see cref="IServiceProvider"/>.</remarks>
public void RegisterServiceManager()
{
this.RegisterSingleton<IServiceManager, ServiceManager>(sp => this);
this.RegisterSingleton<ServiceManager, ServiceManager>(sp => this);
this.RegisterSingleton<IServiceProducer, ServiceManager>(sp => this);
this.RegisterSingleton<IServiceProvider, ServiceManager>(sp => this);
}
/// <summary>
/// Creates a scoped <see cref="IServiceProvider"/>.
/// </summary>
@@ -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<object>();
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);
}
}
+3 -3
View File
@@ -8,10 +8,10 @@
<Company />
<Product></Product>
<Description>Service lifetime management and dependency injection framework.</Description>
<AssemblyVersion>1.9</AssemblyVersion>
<FileVersion>1.9</FileVersion>
<AssemblyVersion>1.9.1</AssemblyVersion>
<FileVersion>1.9.1</FileVersion>
<PackageProjectUrl>https://github.com/AlexMacocian/Slim</PackageProjectUrl>
<Version>1.9</Version>
<Version>1.9.1</Version>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
-12
View File
@@ -101,12 +101,6 @@
Interface allowing to produce services for the <see cref="T:Slim.ServiceManager"/>.
</summary>
</member>
<member name="M:Slim.IServiceProducer.RegisterServiceManager">
<summary>
Register the current service manager as a valid dependency.
</summary>
<remarks>Registers current service manager as <see cref="T:Slim.ServiceManager"/>, <see cref="T:Slim.IServiceManager"/>, <see cref="T:Slim.IServiceProducer"/>, <see cref="T:Slim.IServiceProvider"/>.</remarks>
</member>
<member name="M:Slim.IServiceProducer.IsRegistered(System.Type)">
<summary>
Returns true if there exists a registration for <paramref name="tInterface"/>.
@@ -673,12 +667,6 @@
<exception cref="T:System.ArgumentNullException">Thrown when the provided serviceFactory is null.</exception>
<exception cref="T:System.InvalidOperationException">Thrown when <see cref="T:Slim.ServiceManager"/> contains an entry for the provided interface type.</exception>
</member>
<member name="M:Slim.ServiceManager.RegisterServiceManager">
<summary>
Register the current service manager as a valid dependency.
</summary>
<remarks>Registers current service manager as <see cref="T:Slim.ServiceManager"/>, <see cref="T:Slim.IServiceManager"/>, <see cref="T:Slim.IServiceProducer"/>, <see cref="T:Slim.IServiceProvider"/>.</remarks>
</member>
<member name="M:Slim.ServiceManager.CreateScope">
<summary>
Creates a scoped <see cref="T:Slim.IServiceProvider"/>.