renaming and cleanup
This commit is contained in:
parent
c381375dbd
commit
9c5a1e7ab8
@ -16,16 +16,17 @@ namespace SmallInjectorDemo
|
|||||||
/// <typeparam name="TService">Type of the service.</typeparam>
|
/// <typeparam name="TService">Type of the service.</typeparam>
|
||||||
/// <typeparam name="TInterface">Type of the interface of the service.</typeparam>
|
/// <typeparam name="TInterface">Type of the interface of the service.</typeparam>
|
||||||
/// <param name="isSingleton">True if the service should be singleton. False otherwise.</param>
|
/// <param name="isSingleton">True if the service should be singleton. False otherwise.</param>
|
||||||
public void RegisterType<TService, TInterface>(bool isSingleton)
|
/// <param name="instance">instance of the service</param>
|
||||||
|
public void RegisterType<TService, TInterface>(bool isSingleton, TService instance = default(TService))
|
||||||
{
|
{
|
||||||
_container.Add(typeof(TInterface), new RegisteredType(typeof(TService), isSingleton));
|
_container.Add(typeof(TInterface), new RegisteredType(typeof(TService), isSingleton, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Register types in the resolve container.
|
/// Register types in the resolve container.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TService">Type of the service.</typeparam>
|
/// <typeparam name="TService">Type of the service.</typeparam>
|
||||||
public void RegisterType<TService>(bool isSingleton) => RegisterType<TService, TService>(isSingleton);
|
public void RegisterType<TService>(bool isSingleton, TService instance = default(TService)) => RegisterType<TService, TService>(isSingleton, instance);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Resolve service of specified type.
|
/// Resolve service of specified type.
|
||||||
@ -42,38 +43,33 @@ namespace SmallInjectorDemo
|
|||||||
public object Resolve(Type serviceInterface)
|
public object Resolve(Type serviceInterface)
|
||||||
{
|
{
|
||||||
if (!_container.TryGetValue(serviceInterface, out var registeredType))
|
if (!_container.TryGetValue(serviceInterface, out var registeredType))
|
||||||
{
|
|
||||||
throw new Exception("Can't resolve dependency " + serviceInterface);
|
throw new Exception("Can't resolve dependency " + serviceInterface);
|
||||||
}
|
|
||||||
|
|
||||||
if (registeredType.IsSingleton && registeredType.SingletonInstance != null)
|
if (registeredType.IsSingleton && registeredType.Instance != null)
|
||||||
return registeredType.SingletonInstance;
|
return registeredType.Instance;
|
||||||
var constructor = registeredType.ConcreteType.GetConstructors()[0];
|
var constructor = registeredType.ServiceType.GetConstructors()[0];
|
||||||
var parameters = constructor.GetParameters();
|
var parameters = constructor.GetParameters();
|
||||||
var constructorParameters = new object[parameters.Length];
|
var constructorParameters = new object[parameters.Length];
|
||||||
for (var i = 0; i < parameters.Length; i++)
|
for (var i = 0; i < parameters.Length; i++)
|
||||||
{
|
{
|
||||||
constructorParameters[i] = Resolve(parameters[i].ParameterType);
|
constructorParameters[i] = Resolve(parameters[i].ParameterType);
|
||||||
}
|
}
|
||||||
|
var instance = constructor.Invoke(constructorParameters);
|
||||||
if (registeredType.IsSingleton)
|
return registeredType.IsSingleton ? (registeredType.Instance = instance) : instance;
|
||||||
{
|
|
||||||
return registeredType.SingletonInstance ?? (registeredType.SingletonInstance = constructor.Invoke(constructorParameters));
|
|
||||||
}
|
|
||||||
return constructor.Invoke(constructorParameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class RegisteredType
|
private class RegisteredType
|
||||||
{
|
{
|
||||||
public RegisteredType(Type concreteType, bool isSingleton)
|
public RegisteredType(Type serviceType, bool isSingleton, object instance)
|
||||||
{
|
{
|
||||||
ConcreteType = concreteType;
|
ServiceType = serviceType;
|
||||||
IsSingleton = isSingleton;
|
IsSingleton = isSingleton;
|
||||||
|
Instance = instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly bool IsSingleton;
|
public readonly bool IsSingleton;
|
||||||
public readonly Type ConcreteType;
|
public readonly Type ServiceType;
|
||||||
public object SingletonInstance { get; set; }
|
public object Instance { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user