internal void Initialise(IEnumerable <Type> types) { Timing.StartTimer(Timing.ModuleResolverTimer, "Resolver Initialise", "Freeze Check"); InitCheck(false); Freeze(); Timing.MarkTimer(Timing.ModuleResolverTimer, "Get Filters"); //Key: module type //value: attributes that module wants var filters = _modules.ToDictionary(x => x.Key, x => x.Value.GetAttributeTypesToFilterOn()); Timing.MarkTimer(Timing.ModuleResolverTimer, "Get desired class attributes"); //All class attributes wanted by all modules var classAttributes = filters .Values .SelectMany(x => x) .Where(x => { var attr = x.GetCustomAttribute <AttributeUsageAttribute>(); return(attr == null || attr.ValidOn.HasFlag(AttributeTargets.Class)); }) .Distinct() .ToList(); Timing.MarkTimer(Timing.ModuleResolverTimer, "Find types with class attributes"); var equalComparer = new TypeAssignableEqualityComparer(classAttributes); //Key: matched code-first type //value: all relevant attributes on that type var classAttributeMatches = types.ToDictionary(type => type, type => type.GetCustomAttributes().Select(y => y.GetType()).Intersect(classAttributes, equalComparer)).Where(x => x.Value.Any()).ToDictionary(x => x.Key, x => x.Value); var satisfiedDependencies = new List <Type>(); var queue = new List <Type>(_order); while (queue.Count > 0) { var allModulesWhichCanBeInitialised = queue.Where(x => _modules[x].GetPrerequisites().Except(satisfiedDependencies).Count() == 0).ToList(); if (CodeFirstManager.Current.Features.UseConcurrentInitialisation) { InitialiseModulesConcurrent(filters, equalComparer, classAttributeMatches, satisfiedDependencies, queue, allModulesWhichCanBeInitialised); } else { InitialiseModules(filters, equalComparer, classAttributeMatches, satisfiedDependencies, queue, allModulesWhichCanBeInitialised); } } //Umbraco.Core.ApplicationContext.EnsureContext(originalContext, true); _initialised = true; Timing.EndTimer(Timing.ModuleResolverTimer, "Completed Initialisation of modules"); }