递归实现依赖注入
创建所需的依赖服务类
1public class Test2{3    public void PrintTest()4    {5        Console.WriteLine("Hello World");6    }7}89public class Test2
10{
11    private readonly Test _test;
12
13    public Test2(Test test)
14    {
15        this._test = test;
16    }
17    public void PrintTest2()
18    {
19        _test.PrintTest();
20    }
21}
22
23public class Test3
24{
25    private readonly Test2 _test2;
26
27    public Test3(Test2 test2)
28    {
29        this._test2 = test2;
30    }
31
32    public void PrintTest3()
33    {
34        _test2.PrintTest2();
35    }
36}
层层递进之傻瓜式创建实例
1#region  写法一  无脑new 出实例化对象
2var test = new Test();
3var test2 = new Test2(test);
4
5test.PrintTest();
6test2.PrintTest2();
7#endregion
层层递进之反射创建实例
1#region 写法二  反射创建实例对象
2var test = (Test)Activator.CreateInstance(typeof(Test));
3var test2 = (Test2)Activator.CreateInstance(typeof(Test2), test);
4
5test.PrintTest();
6test2.PrintTest2();
7#endregion
层层递进之单层有参构造实例
1#region 写法四  单层有参数构造实例2using System.Reflection;34var container = new Container();5container.Add(typeof(Test));6container.Add<Test2>();78var service = new ContainerService(container);9var test = service.GenerateService<Test>();
10var test2 = service.GenerateServiceWithParameter<Test2>();  // 
11test.PrintTest();
12test2.PrintTest2();
13
14#endregion
层次递进之多层有参构造实例
1#region 多层有参数构造函数实例2using System.Reflection;34var container = new Container();5container.Add(typeof(Test));6container.Add<Test2>();7container.Add<Test3>();89var service = new ContainerService(container);
10var test = service.GenerateService<Test>();
11var test2 = service.GenerateServiceWithParameter<Test2>(); 
12var test3 = service.GenerateServiceComplted<Test3>(); 
13test.PrintTest();
14test2.PrintTest2();
15test3.PrintTest3();
16#endregion
容器类生成以及调用
1public class ContainerService2{3    private readonly Container _container;45    public ContainerService(Container container)6    {7        this._container = container;8    }9
10    public T GenerateService<T>()
11    {
12        var type = _container.GetDependencyType(typeof(T));
13        // 实例化
14        return (T)Activator.CreateInstance(type);
15    }
16
17    /// <summary>
18    /// 单层构造参数实例
19    /// </summary>
20    /// <typeparam name="T"></typeparam>
21    /// <returns></returns>
22    public T GenerateServiceWithParameter<T>()
23    {
24        var type = _container.GetDependencyType(typeof(T));
25        var constructor = type.GetConstructors().Single();
26        ParameterInfo[] paras = constructor.GetParameters().ToArray();
27        if(paras.Length > 0)
28        {
29            var arr = new Object[paras.Length];
30            for (int i = 0; i < paras.Length; i++)
31            {
32                arr[i] = Activator.CreateInstance(paras[i].ParameterType);
33            }
34            return (T)Activator.CreateInstance(type, arr);
35        }
36        return (T)Activator.CreateInstance(type);
37    }
38
39    public Object GenerateType(Type type)
40    {
41        var serviceType = _container.GetDependencyType(type);
42        var constructor = serviceType.GetConstructors().Single();
43        ParameterInfo[] paras = constructor.GetParameters().ToArray();
44        if (paras.Length > 0)
45        {
46            var arr = new Object[paras.Length];
47            for (int i = 0; i < paras.Length; i++)
48            {
49                arr[i] = GenerateType(paras[i].ParameterType);
50            }
51            return Activator.CreateInstance(serviceType, arr);
52        }
53        return Activator.CreateInstance(serviceType);
54    }
55
56    public T GenerateServiceComplted<T>()
57    {
58        return (T)GenerateType(typeof(T));
59    }
60
61}
62
63public class Container 
64{
65    List<Type> _lists;
66
67    public Container()
68    {
69        _lists = new List<Type>();
70    }
71    public void Add<T>()
72    {
73        _lists.Add(typeof(T));
74    }
75
76    public void Add(Type type)
77    {
78        _lists.Add(type);
79    }
80
81    public Type GetDependencyType(Type type)
82    {
83        return _lists.FirstOrDefault(x => x.Name == type.Name);
84    }
85}