mirror of
https://github.com/AlexMacocian/Slim.git
synced 2026-07-15 15:19:59 +00:00
Hardcode servicemanager registration (#19)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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"/>.
|
||||
|
||||
Reference in New Issue
Block a user