@@ -162,37 +162,54 @@ public virtual List<IModuleDescriptor> ModuleSort<TModule>(List<IModuleDescripto
162162 /// </summary>
163163 /// <param name="moduleType"></param>
164164 /// <returns></returns>
165- protected virtual List < IModuleDescriptor > VisitModule ( Type moduleType )
165+ protected virtual List < IModuleDescriptor > VisitModule ( Type moduleType , Type parentModuleType = null , Dictionary < Type , bool > parentDependModuleType = null )
166166 {
167167 var moduleDescriptors = new List < IModuleDescriptor > ( ) ;
168168 if ( ! moduleType . IsModule ( ) )
169169 {
170- return moduleDescriptors ;
170+ goto end ;
171+ }
172+ if ( parentDependModuleType == null )
173+ {
174+ parentDependModuleType = new Dictionary < Type , bool > ( ) ;
171175 }
172176
173- // 依赖标记
177+ // 获取依赖模块信息
174178 var dependModulesAttribute = moduleType . GetCustomAttribute < DependsOnAttribute > ( false ) ;
175179
176- // 依赖属性为空
180+ // 创建模块信息
181+ // 依赖模块为空
177182 if ( dependModulesAttribute == null )
178183 {
179- moduleDescriptors . Add ( new ModuleDescriptor ( moduleType ) ) ;
184+ moduleDescriptors . Add (
185+ new ModuleDescriptor ( moduleType )
186+ ) ;
187+ goto end ;
180188 }
181- else
189+
190+ // 依赖属性不为空,递归获取依赖
191+ var dependModuleDescriptors = new List < IModuleDescriptor > ( ) ;
192+ foreach ( var dependModuleType in dependModulesAttribute . DependModuleTypes )
182193 {
183- // 依赖属性不为空,递归获取依赖
184- var dependModuleDescriptors = new List < IModuleDescriptor > ( ) ;
185- foreach ( var dependModuleType in dependModulesAttribute . DependModuleTypes )
194+ if ( parentDependModuleType . TryGetValue ( dependModuleType , out var isEx ) || dependModuleType == parentModuleType )
186195 {
187- dependModuleDescriptors . AddRange (
188- this . VisitModule ( dependModuleType )
189- ) ;
196+ throw new InvalidOperationException ( $ "There are cyclic dependencies!\r \n { moduleType . FullName } <--> { dependModuleType . FullName } ") ;
190197 }
191198
192- // 创建模块描述信息,内容为模块类型和依赖类型
193- moduleDescriptors . Add ( new ModuleDescriptor ( moduleType , dependModuleDescriptors . ToArray ( ) ) ) ;
199+ parentDependModuleType . Add ( dependModuleType , true ) ;
200+ dependModuleDescriptors . AddRange (
201+ this . VisitModule ( dependModuleType , moduleType , parentDependModuleType )
202+ ) ;
194203 }
195204
205+ parentDependModuleType . Clear ( ) ;
206+ // 创建模块信息,内容为模块类型和依赖信息
207+ moduleDescriptors . Add (
208+ new ModuleDescriptor ( moduleType , dependModuleDescriptors . ToArray ( ) )
209+ ) ;
210+
211+
212+ end : // 返回结果
196213 return moduleDescriptors ;
197214 }
198215
0 commit comments