예제 #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");
        }
예제 #2
0
        private void InitialiseModule(Dictionary <Type, IEnumerable <Type> > filters, TypeAssignableEqualityComparer equalComparer, Dictionary <Type, IEnumerable <Type> > classAttributeMatches, Type t)
        {
            Timing.MarkTimer(Timing.ModuleResolverTimer, "Get types to initialise module " + t.Name);
            var classes = classAttributeMatches.Where(x => x.Value.Intersect(filters[t], equalComparer).Any()).Select(x => x.Key);

            Timing.MarkTimer(Timing.ModuleResolverTimer, "Initialising module " + t.Name);
            CodeFirstManager.Current.Log("Initialising module " + t.FullName + " with " + classes.Count() + " types", this);
            _instances[t].Initialise(classes);
        }
예제 #3
0
        private void InitialiseModules(Dictionary <Type, IEnumerable <Type> > filters, TypeAssignableEqualityComparer equalComparer, Dictionary <Type, IEnumerable <Type> > classAttributeMatches, List <Type> satisfiedDependencies, List <Type> queue, List <Type> toDo)
        {
            var tasks = new List <Task>();

            foreach (Type t in toDo)
            {
                queue.Remove(t);
                InitialiseModule(filters, equalComparer, classAttributeMatches, t);
                satisfiedDependencies.Add(t);
            }
        }
예제 #4
0
        private void InitialiseModulesConcurrent(Dictionary <Type, IEnumerable <Type> > filters, TypeAssignableEqualityComparer equalComparer, Dictionary <Type, IEnumerable <Type> > classAttributeMatches, List <Type> satisfiedDependencies, List <Type> queue, List <Type> toDo)
        {
            var tasks = new List <Task>();

            foreach (Type t in toDo)
            {
                queue.Remove(t);
                var task = new Task(() =>
                {
                    InitialiseModule(filters, equalComparer, classAttributeMatches, t);
                    lock (satisfiedDependencies)
                    {
                        satisfiedDependencies.Add(t);
                    }
                });
                tasks.Add(task);
                task.Start();
            }
            Task.WaitAll(tasks.ToArray());
        }