IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Avatar
Autor: Patrik Pastor
Aktivity