/// <summary> /// Try to resolve the instantiation calling constructor with dependencies. /// </summary> /// <param name="register">Factory register.</param> /// <param name="instance">The instance.</param> /// <returns>If set to <c>true</c>, instance was created.</returns> private bool TryDependencieResolve(FactoryRegister register, out object instance) { instance = null; var dependenciesInstances = new List <object>(register.Dependencies.Length); for (int i = 0; i < register.Dependencies.Length; i++) { dependenciesInstances.Add(this.Create(register.Dependencies[i])); } if (register.ClassType.GetConstructor(register.Dependencies) != null) { instance = Activator.CreateInstance(register.ClassType, dependenciesInstances.ToArray()); } return(instance != null); }
/// <summary> /// Try to resolve the instantiation calling parameterless constructor. /// </summary> /// <param name="register">Factory register.</param> /// <param name="instance">The instance.</param> /// <returns>If set to <c>true</c>, instance was created.</returns> private bool TrySimpleResolve(FactoryRegister register, out object instance) { instance = null; if (register.Dependencies.Length == 0) { if (register.ClassType.GetConstructor(Type.EmptyTypes) == null) { return(false); } instance = Activator.CreateInstance(register.ClassType); return(true); } return(false); }
/// <summary> /// Resolve the instiation configured on register. /// </summary> /// <param name="register">The register.</param> /// <returns>The instatiated class</returns> private object Resolve(FactoryRegister register) { object instance; if (this.TrySimpleResolve(register, out instance)) { return(instance); } if (this.TryDependencieResolve(register, out instance)) { return(instance); } throw new Exception(string.Format("It was not possible to instantiate '{0}' from contract '{1}'.", register.ClassType.Name, register.ContractType.Name)); }
/// <summary> /// Register a contract to a class. /// </summary> /// <typeparam name="T">Contract type.</typeparam> /// <typeparam name="K">Class type.</typeparam> /// <param name="dependencies">List of dependencies.</param> public void Register <T, K>(params Type[] dependencies) where K : T { var register = new FactoryRegister(typeof(T), typeof(K), dependencies); _registers.TryAdd(typeof(T), register); }