Playing with CommonServiceLocator

This commit is contained in:
2019-07-28 15:01:39 +02:00
parent 3a45db0d77
commit 800a06fc5a
6 changed files with 88 additions and 22 deletions

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace SmallInjector
{
@@ -8,13 +9,21 @@ namespace SmallInjector
/// </summary>
public class Container : IContainer
{
private readonly Dictionary<Type, RegisteredType> _container = new Dictionary<Type, RegisteredType>();
private readonly Dictionary<Type, List<RegisteredType>> _container = new Dictionary<Type, List<RegisteredType>>();
/// <inheritdoc/>
public void RegisterType<TService, TInterface>(bool isSingleton, TService instance = default)
where TService : TInterface
{
_container.Add(typeof(TInterface), new RegisteredType(typeof(TService), isSingleton, null));
if (!IsRegistered<TService>())
{
_container[typeof(TInterface)] = new List<RegisteredType>
{new RegisteredType(typeof(TService), isSingleton, null)};
}
else
{
_container[typeof(TInterface)].Add(new RegisteredType(typeof(TService), isSingleton, null));
}
}
/// <inheritdoc/>
@@ -30,26 +39,38 @@ namespace SmallInjector
/// <inheritdoc />
public bool IsRegistered(Type serviceType) => _container.ContainsKey(serviceType);
/// <inheritdoc/>
public object Resolve(Type serviceInterface)
/// <inheritdoc />
public IEnumerable<object> ResolveAny(Type serviceType)
{
if (!_container.TryGetValue(serviceInterface, out var registeredType))
throw new Exception(@"Dependency {serviceInterface} is not registered");
if (registeredType.IsSingleton && registeredType.Instance != null)
return registeredType.Instance;
var constructor = registeredType.ServiceType.GetConstructors()[0];
var parameters = constructor.GetParameters();
var constructorParameters = new object[parameters.Length];
for (var i = 0; i < parameters.Length; i++)
if (!_container.TryGetValue(serviceType, out var registeredTypes))
throw new Exception(@"Dependency {serviceType} is not registered");
foreach (var registeredType in registeredTypes)
{
constructorParameters[i] = Resolve(parameters[i].ParameterType);
}
if (registeredType.IsSingleton && registeredType.Instance != null)
{
yield return registeredType.Instance;
continue;
}
var instance = constructor.Invoke(constructorParameters);
return registeredType.IsSingleton ? (registeredType.Instance = instance) : instance;
var constructor = registeredType.ServiceType.GetConstructors()[0];
var parameters = constructor.GetParameters();
var constructorParameters = new object[parameters.Length];
for (var i = 0; i < parameters.Length; i++)
{
constructorParameters[i] = Resolve(parameters[i].ParameterType);
}
var instance = constructor.Invoke(constructorParameters);
yield return registeredType.IsSingleton ? (registeredType.Instance = instance) : instance;
}
}
/// <inheritdoc />
public IEnumerable<object> ResolveAny<TService>() => ResolveAny(typeof(TService));
/// <inheritdoc/>
public object Resolve(Type serviceType) => ResolveAny(serviceType).First();
private class RegisteredType
{
public bool IsSingleton { get; }