DI
C# .NET
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApp1
{
class DIContainer
{
private Dictionary<string, object> loadedObjects;
private List<object> GetDependencies(object cl)
{
List<object> dependencies = new List<object>();
Type typeOfCls = cl.GetType();
ConstructorInfo[] conInfo = typeOfCls.GetConstructors();
if (conInfo.Length > 0)
{
foreach(ConstructorInfo ci in conInfo)
{
ParameterInfo[] parameters = ci.GetParameters();
parameters.ToList().ForEach(par =>
dependencies.Add(getInstance(par)));
parameters.ToList().ForEach(par =>
loadedObjects.Add(getInstance(par).GetType().Name, getInstance(par)));
}
}
return dependencies;
}
public object getInstance(object cls, params object[] otherParams)
{
if (!loadedObjects.ContainsValue(cls))
{
object instance = null;
List<object> dependencies = GetDependencies(cls);
ConstructorInfo[] objectsInfo = cls.GetType().GetConstructors();
List<object> instanceParams = new List<object>();
foreach (object dependency in dependencies)
{
ConstructorInfo[] dependencyInfos = dependency.GetType().GetConstructors();
foreach (ConstructorInfo conInfo in dependencyInfos)
{
object newDependency = conInfo.Invoke(otherParams);
instanceParams.Add(newDependency);
}
}
foreach (ConstructorInfo objectInfo in objectsInfo)
{
instance = objectInfo.Invoke(instanceParams.ToArray());
loadedObjects.Add(instance.GetType().Name, instance);
}
return instance;
}
else if (loadedObjects.ContainsValue(cls))
{
return loadedObjects[cls.GetType().Name];
}
else
throw new Exception(string.Format("Trida {0} neexistuje", cls.GetType().Name));
}
}
}
Neformátovaný
Přidáno: 26.6.2019
Expirace: Neuvedeno