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; }
/// <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); } } }