1 /// <summary>
2 /// 此类作用:容器实体,使用App_Data\unity.config文件配置,根据XML配置初始化IOC Created by ZhangQC 2016.08.08
3 /// </summary>
4 public partial class IocFactory
5 {
6 /// <summary>
7 /// 依赖注入容器
8 /// </summary>
9 private static IUnityContainer _container;
10
11 /// <summary>
12 /// 构造函数
13 /// </summary>
14 static IocFactory()
15 {
16 //初始化依赖注入容器
17 InitContainer();
18 }
19
20 /// <summary>
21 /// 初始化容器
22 /// </summary>
23 private static void InitContainer()
24 {
25 //实例化容器
26 _container = new UnityContainer();
27
28 _container.AddNewExtension<Interception>();
29
30 // Unity只会调用标识了InjectionConstructor特性的构造函数,这样就很好的解决了多构造函数的情况下,Unity调用哪个构造函数。
31
32 var unityConfig = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"App_Data\unity.config");
33 if (!File.Exists(unityConfig))
34 {
35 return;
36 }
37
38 var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = unityConfig };
39 var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
40 var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
41 _container.LoadConfiguration(unitySection);
42 }
43
44 /// <summary>
45 /// 容器对象
46 /// </summary>
47 [Obsolete("容器对象,放开之后,可以随便操作,但千万千万不要随便操作,挂了后果自负!")]
48 public static IUnityContainer UnityContainer
49 {
50 get
51 {
52 return _container;
53 }
54 }
55
56 /// <summary>
57 /// 根据类型,返回注册的实例
58 /// </summary>
59 /// <typeparam name="T">各种实例</typeparam>
60 /// <returns>各种实例</returns>
61 [Obsolete("不建议使用,请使用Resolve", true)]
62 public static T GetBizInstance<T>()
63 {
64 return Resolve<T>();
65 }
66
67 /// <summary>
68 /// 根据类型,返回注册的实例
69 /// </summary>
70 /// <typeparam name="T">各种实例</typeparam>
71 /// <returns>各种实例</returns>
72 public static T Resolve<T>()
73 {
74 return _container.Resolve<T>();
75 }
76
77 /// <summary>
78 /// 根据类型,返回注册的实例
79 /// </summary>
80 /// <typeparam name="T">各种实例</typeparam>
81 /// <param name="name">注册的别名</param>
82 /// <returns>各种实例</returns>
83 public static T Resolve<T>(string name)
84 {
85 return _container.Resolve<T>(name);
86 }
87
88 /// <summary>
89 /// 返回所有已经注册的实例
90 /// </summary>
91 /// <typeparam name="T">接口</typeparam>
92 /// <param name="resolverOverrides"></param>
93 /// <returns>实体</returns>
94 public IEnumerable<T> ResolveAll<T>(params ResolverOverride[] resolverOverrides)
95 {
96 return _container.ResolveAll<T>(resolverOverrides);
97 }
98
99 /// <summary>
100 /// 判断类型是否已注册
101 /// </summary>
102 /// <typeparam name="T">类型</typeparam>
103 /// <returns>true已注册,false未注册</returns>
104 public static bool IsRegistered<T>()
105 {
106 return _container.IsRegistered<T>();
107 }
108
109 /// <summary>
110 /// 判断类型是否已注册
111 /// </summary>
112 /// <typeparam name="T">类型</typeparam>
113 /// <returns>true已注册,false未注册</returns>
114 public static bool IsRegistered<T>(string name)
115 {
116 return _container.IsRegistered<T>(name);
117 }
118
119 ///// <summary>
120 ///// 注册指定子类至父类
121 ///// </summary>
122 ///// <typeparam name="TFrom">父类或接口</typeparam>
123 ///// <typeparam name="TTo">子类或实现</typeparam>
124 ///// <returns>各种实例</returns>
125 //public static void RegisterType<TFrom, TTo>() where TTo : TFrom
126 //{
127 // _container.RegisterType<TFrom, TTo>();
128 //}
129 /// <summary>
130 /// 注册指定子类至父类
131 /// </summary>
132 /// <typeparam name="TFrom">父类或接口</typeparam>
133 /// <typeparam name="TTo">子类或实现</typeparam>
134 /// <param name="name">注册的别名</param>
135 /// <returns>各种实例</returns>
136 public static void RegisterType<TFrom, TTo>(string name) where TTo : TFrom
137 {
138 _container.RegisterType<TFrom, TTo>(name);
139 }
140
141 /// <summary>
142 /// Register a type mapping with the container.
143 ///
144 /// </summary>
145 ///
146 /// <remarks>
147 ///
148 /// <para>
149 /// This method is used to tell the container that when asked for type <typeparamref name="TFrom"/>,
150 /// actually return an instance of type <typeparamref name="TTo"/>. This is very useful for
151 /// getting instances of interfaces.
152 ///
153 /// </para>
154 ///
155 /// <para>
156 /// This overload registers a default mapping and transient lifetime.
157 ///
158 /// </para>
159 ///
160 /// </remarks>
161 /// <typeparam name="TFrom"><see cref="T:System.Type"/> that will be requested.</typeparam><typeparam name="TTo"><see cref="T:System.Type"/> that will actually be returned.</typeparam><param name="container">Container to configure.</param><param name="injectionMembers">Injection configuration objects.</param>
162 /// <returns>
163 /// The <see cref="T:Microsoft.Practices.Unity.UnityContainer"/> object that this method was called on (this in C#, Me in Visual Basic).
164 /// </returns>
165 public static void RegisterType<TFrom, TTo>(params InjectionMember[] injectionMembers) where TTo : TFrom
166 {
167 _container.RegisterType<TFrom, TTo>(injectionMembers);
168 }
169
170 /// <summary>
171 /// 注册接口的实例
172 /// </summary>
173 /// <param name="name">别名</param>
174 /// <param name="instance">实例,即new XX()</param>
175 /// <typeparam name="TInterface">接口</typeparam>
176 public void RegisterInstance<TInterface>(string name, TInterface instance)
177 {
178 _container.RegisterInstance<TInterface>(name, instance);
179 }
180
181 }