renaming and cleanup

This commit is contained in:
Holger Boerchers 2018-08-12 19:52:18 +02:00
parent c381375dbd
commit 9c5a1e7ab8

View File

@ -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; }
} }
} }
} }