示例#1
0
        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");
        }