Ejemplo n.º 1
0
        public static void InitializeConstraints(IConstraintFactory constraintFactory, PluginFactory pluginFactory, DbContext entityContext)
        {
            var constraintTypes = entityContext.Set <ConstraintDefinition>();
            Dictionary <string, object> emptyDict = new Dictionary <string, object>
            {
                { "Ask", Ask.Value },
                { "AskType", typeof(Ask) }
            };

            foreach (var constraintType in constraintTypes)
            {
                Type targetType           = (Type)ExpressionParser.Parse(constraintType.ConstraintType, emptyDict, a => { DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession); });
                ConstraintConstructor cst = new ConstraintConstructor(targetType,
                                                                      constraintType.ConstraintIdentifier);
                constraintType.Parameters.OrderBy(n => n.ParameterOrder)
                .ForEach(
                    n =>
                    cst.Parameters.Add(
                        new ConstructorParameter(ExpressionParser.Parse(n.ParameterValue, emptyDict, a => { DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession); }),
                                                 (Type)ExpressionParser.Parse(n.ParameterType, emptyDict, a => { DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession); }))));
                constraintFactory.RegisterType(cst);
            }

            var dc = new DeciderContext {
                PluginFactory = pluginFactory, ConstraintFactory = constraintFactory, DbContext = entityContext
            };

            factory2Decisions.TryAdd(constraintFactory, dc);
            context2Decisions.TryAdd(entityContext, dc);
            constraintFactory.Disposed += UnRegisterFactory;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Registers a constructor in this factory
        /// </summary>
        /// <param name="constructor">te provided constructor for a specific constraint type</param>
        public void RegisterType(ConstraintConstructor constructor)
        {
            lock (bufferedConstructors)
            {
                lock (registeredConstructors)
                {
                    ConstraintConstructor cst =
                        registeredConstructors.FirstOrDefault(n => n.Identifier == constructor.Identifier);
                    if (cst != null)
                    {
                        registeredConstructors.Remove(cst);
                        if (bufferedConstructors.ContainsKey(constructor.Identifier))
                        {
                            bufferedConstructors.Remove(constructor.Identifier);
                        }
                    }

                    registeredConstructors.Add(constructor);
                }
            }
        }