欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2、手写Unity容器--第一层依赖注入

程序员文章站 2022-06-11 16:19:36
这个场景跟《手写Unity容器--极致简陋版Unity容器》不同,这里构造AndroidPhone的时候,AndroidPhone依赖于1个IPad 1、IPhone接口 2、AndroidPhone实现 3、IPad接口 4、IPad实现 5、容器--接口 6、容器--实现 7、调用 ......

这个场景跟《手写unity容器--极致简陋版unity容器》不同,这里构造androidphone的时候,androidphone依赖于1个ipad

2、手写Unity容器--第一层依赖注入

1、iphone接口

namespace simplestunity_onelayer
{
    interface iphone
    {
        void call();
    }
}

2、androidphone实现

namespace simplestunity_onelayer
{
    public class androidphone : iphone
    {
        public androidphone()
        {
            console.writeline("{0}构造函数", this.gettype().name);
        }
    }
}

3、ipad接口

namespace simplestunity_onelayer
{
    public interface ipad
    {
        void show();
    }
}

4、ipad实现

namespace simplestunity_onelayer
{
    public class androidpad:ipad
    {
        public androidpad()
        {
            console.writeline("{0}构造函数", this.gettype().name);
        }

        public void show()
        {
            console.writeline("看{0}", this.gettype().name);
        }
    }
}

5、容器--接口

public interface idavidcontainer
{
    void registertype<tfrom, tto>();
    
    t resolve<t>();
}

6、容器--实现

namespace simplestunity_onelayer
{
    /// <summary>
    /// 容器--工厂
    /// </summary>
    public class daivdcontainer:idaivdcontainer
    {
        private dictionary<string, type> containerdictionary = new dictionary<string, type>();//字典

        /// <summary>
        /// 注册类型
        /// </summary>
        /// <typeparam name="tfrom"></typeparam>
        /// <typeparam name="tto"></typeparam>
        public void registertype<tfrom, tto>()
        {
            containerdictionary.add(typeof(tfrom).fullname, typeof(tto));
        }

        /// <summary>
        /// 获取实例
        /// </summary>
        /// <typeparam name="t"></typeparam>
        /// <returns></returns>
        public t resolve<t>()
        {
            type type = containerdictionary[typeof(t).fullname];
            //1、得到类型的所有构造函数
            constructorinfo[] ctorarray = type.getconstructors();

            //2、只得到有标记davidinjectionconstructor特性的构造函数,如果都没有标记特性,那么得到参数最多的构造函数
            constructorinfo currentctor = null;

            if (ctorarray.count(c => c.isdefined(typeof(davidinjectionconstructor), true)) > 0)
            {
                currentctor = ctorarray.firstordefault(c => c.isdefined(typeof(davidinjectionconstructor), true));//得到第1个标记davidinjectionconstructor特性的构造函数
            }
            else
            {
                currentctor = ctorarray.orderbydescending(c => c.getparameters().length).firstordefault();//得到参数个数最多的构造函数
            }
            list<object> paralist = new list<object>();
            
            foreach (var para in currentctor.getparameters())
            {
                //得到的参数类型是ipad,抽象无法创建实例
                var paratype = para.parametertype;
                //所以根据ipad key,得到androidpad类型,具体类型就可以创建实例
                var targetparatype = containerdictionary[paratype.fullname];
                paralist.add(activator.createinstance(targetparatype));
            }
            return (t)activator.createinstance(type,paralist.toarray());
        }
    }
}

7、调用

namespace simplestunity_onelayer
{
    class program
    {
        static void main(string[] args)
        {
            daivdcontainer davidcontainer = new daivdcontainer();
            davidcontainer.registertype<iphone, androidphone>();
            davidcontainer.registertype<ipad, androidpad>();
            iphone iphone = davidcontainer.resolve<iphone>();
            iphone.call();
        }
    }
}

2、手写Unity容器--第一层依赖注入

2、手写Unity容器--第一层依赖注入