Ejemplo n.º 1
0
        public ScriptContext Init()
        {
            if (HasInit)
            {
                return(this);
            }
            HasInit = true;

            if (InsertScriptMethods.Count > 0)
            {
                ScriptMethods.InsertRange(0, InsertScriptMethods);
            }
            if (InsertScriptBlocks.Count > 0)
            {
                ScriptBlocks.InsertRange(0, InsertScriptBlocks);
            }
            if (InsertPlugins.Count > 0)
            {
                Plugins.InsertRange(0, InsertPlugins);
            }

            foreach (var assembly in ScanAssemblies.Safe())
            {
                foreach (var type in assembly.GetTypes())
                {
                    if (typeof(IScriptPlugin).IsAssignableFrom(type))
                    {
                        if (Plugins.All(x => x.GetType() != type))
                        {
                            Container.AddSingleton(type);
                            var plugin = (IScriptPlugin)Container.Resolve(type);
                            Plugins.Add(plugin);
                        }
                    }
                }
            }

            Args[ScriptConstants.Debug] = DebugMode;

            Container.AddSingleton(() => this);
            Container.AddSingleton(() => Pages);

            var beforePlugins = Plugins.OfType <IScriptPluginBefore>();

            foreach (var plugin in beforePlugins)
            {
                plugin.BeforePluginsLoaded(this);
            }
            foreach (var plugin in Plugins)
            {
                plugin.Register(this);
            }

            OnAfterPlugins?.Invoke(this);

            foreach (var type in ScanTypes)
            {
                ScanType(type);
            }

            foreach (var assembly in ScanAssemblies.Safe())
            {
                foreach (var type in assembly.GetTypes())
                {
                    ScanType(type);
                }
            }

            foreach (var method in ScriptMethods)
            {
                InitMethod(method);
            }

            foreach (var block in ScriptBlocks)
            {
                InitBlock(block);
                blocksMap[block.Name] = block;
            }

            ScriptNamespaces = ScriptNamespaces.Distinct().ToList();

            var allTypes = new List <Type>(ScriptTypes);

            foreach (var asm in ScriptAssemblies)
            {
                allTypes.AddRange(asm.GetTypes());
            }

            foreach (var type in allTypes)
            {
                if (!ScriptTypeNameMap.ContainsKey(type.Name))
                {
                    ScriptTypeNameMap[type.Name] = type;
                }

                var qualifiedName = DefaultMethods.typeQualifiedName(type);
                if (!ScriptTypeQualifiedNameMap.ContainsKey(qualifiedName))
                {
                    ScriptTypeQualifiedNameMap[qualifiedName] = type;
                }
            }

            var afterPlugins = Plugins.OfType <IScriptPluginAfter>();

            foreach (var plugin in afterPlugins)
            {
                plugin.AfterPluginsLoaded(this);
            }

            return(this);
        }