c#手写简易IOC

1 interface ImContainer
2     {
3         void RegisterType<TForm, TTo>() where TTo : TForm;
4 
5         TForm Resolve<TForm>();
6     }
 1 class mContainer : ImContainer
 2     {
 3         private Dictionary<string, Type> keyValuePairs = new Dictionary<string, Type>();
 4         public void RegisterType<TForm, TTo>() where TTo : TForm
 5         {
 6             keyValuePairs.Add(typeof(TForm).FullName, typeof(TTo));
 7         }
 8 
 9         public T Resolve<T>()
10         {
11             Type type = keyValuePairs[typeof(T).FullName];
12 
13             return Resolve<T>(type);
14         }
15 
16         private T Resolve<T>(Type type)
17         {
18             if (keyValuePairs.ContainsKey(type.FullName))
19             {
20                 type = keyValuePairs[type.FullName];
21             }
22 
23             //构造注入
24             var ctorArray = type.GetConstructors();
25             var ctor = ctorArray.FirstOrDefault(x => x.IsDefined(typeof(musAttribute), true));
26 
27             if (ctor == null)
28             {
29                 ctor = ctorArray.OrderBy(x => x.GetParameters().Length).Last();
30             }
31 
32             List<object> list = new List<object>();
33             foreach (var item in ctor.GetParameters())
34             {
35                 var itemType = item.ParameterType;
36                 var itemTargeType = keyValuePairs[itemType.FullName];
37                 var target = this.Resolve<object>(itemTargeType);
38                 list.Add(target);
39             }
40 
41             T t = default(T);
42             t = (T)Activator.CreateInstance(type, list.ToArray());
43 
44             //属性注入
45             var protes = type.GetProperties();
46 
47             foreach (var item in protes)
48             {
49                 var isAttr = item.IsDefined(typeof(PromusAttribute));
50                 if (isAttr)
51                 {
52                     var itemType = item.PropertyType;
53                     var itemTargeType = keyValuePairs[itemType.FullName];
54                     item.SetValue(t, this.Resolve<object>(itemTargeType));
55                 }
56             }
57 
58             //方法注入
59             var method = type.GetFields();
60             foreach (var item in method)
61             {
62                 var isAttr = item.IsDefined(typeof(MethodAttribute));
63                 if (isAttr)
64                 {
65                     var itemType = item.FieldType;
66                     var itemTargeType = keyValuePairs[itemType.FullName];
67                     item.SetValue(t, this.Resolve<object>(itemTargeType));
68                 }
69             }
70             return t;
71         }  
72     }

猜你喜欢

转载自www.cnblogs.com/mushuizzz/p/12512200.html