Esempio n. 1
0
        public static ScriptContext CreateNewContext(this ScriptScopeContext scope, Dictionary <string, object> args)
        {
            if (args == null)
            {
                return(new ScriptContext().Init());
            }

            var context = new ScriptContext();

            if (args.TryGetValue("use", out var oUse))
            {
                var use = (Dictionary <string, object>)oUse;
                if (use.TryGetValue("context", out var oContext) && oContext is bool useContext && useContext)
                {
                    return(scope.Context);
                }

                // Use same ThreadSafe plugin instance to preserve configuration
                var plugins = use.TryGetValue("plugins", out var oPlugins)
                    ? ViewUtils.ToStrings("plugins", oPlugins)
                    : null;
                if (plugins != null)
                {
                    foreach (var name in plugins)
                    {
                        var plugin = scope.Context.Plugins.FirstOrDefault(x => x.GetType().Name == name);
                        if (plugin == null)
                        {
                            throw new NotSupportedException($"Plugin '{name}' is not registered in parent context");
                        }

                        context.Plugins.Add(plugin);
                    }
                }

                // Use new filter and block instances which cannot be shared between contexts
                var methods = use.TryGetValue("methods", out var oMethods)
                    ? ViewUtils.ToStrings("methods", oMethods)
                    : use.TryGetValue("filters", out var oFilters)
                        ? ViewUtils.ToStrings("filters", oFilters)
                        : null;
                if (methods != null)
                {
                    foreach (var name in methods)
                    {
                        var filter = scope.Context.ScriptMethods.FirstOrDefault(x => x.GetType().Name == name);
                        if (filter == null)
                        {
                            throw new NotSupportedException($"Filter '{name}' is not registered in parent context");
                        }

                        context.ScriptMethods.Add(filter.GetType().CreateInstance <ScriptMethods>());
                    }
                }

                var blocks = use.TryGetValue("blocks", out var oBlocks)
                    ? ViewUtils.ToStrings("blocks", oBlocks)
                    : null;
                if (blocks != null)
                {
                    foreach (var name in blocks)
                    {
                        var useBlock = scope.Context.ScriptBlocks.FirstOrDefault(x => x.GetType().Name == name);
                        if (useBlock == null)
                        {
                            throw new NotSupportedException($"Block '{name}' is not registered in parent context");
                        }

                        context.ScriptBlocks.Add(useBlock.GetType().CreateInstance <ScriptBlock>());
                    }
                }

                args.Remove(nameof(use));
            }
            context.Init();

            return(context);
        }