Exemplo n.º 1
0
        /// <summary>
        /// Remove by condition
        /// </summary>
        /// <typeparam name="T">Data type</typeparam>
        /// <param name="cacheCommand">Cache command</param>
        /// <param name="databaseCommand">Database command</param>
        public void RemoveByCondition <T>(RemoveByConditionCacheCommand <T> cacheCommand, ICommand databaseCommand) where T : BaseEntity <T>, new()
        {
            CommandCallbackEventParameter callbackParameter = null;
            CommandStartingEventParameter beforeParameter   = null;
            var cacheOperationConfig = DataCacheManager.Configuration.GetDataCacheOperationConfiguration(DataOperationType.RemoveByCondition);

            if (cacheOperationConfig == null)
            {
                return;
            }
            if (cacheCommand.Query?.NoneCondition ?? true)
            {
                callbackParameter = new CommandCallbackEventParameter()
                {
                    Command         = databaseCommand,
                    CommandBehavior = CommandBehavior.RemoveObjectType,
                    Data            = typeof(T)
                };
                beforeParameter = new CommandStartingEventParameter()
                {
                    Command         = databaseCommand,
                    CommandBehavior = CommandBehavior.RemoveObjectType,
                    Data            = typeof(T)
                };
            }
            else if (cacheCommand.GetDataListProxy != null)
            {
                List <T> dataList = GetDatabaseDataList(cacheCommand.Query, cacheCommand.GetDataListProxy);
                if (!dataList.IsNullOrEmpty())
                {
                    callbackParameter = new CommandCallbackEventParameter()
                    {
                        Command         = databaseCommand,
                        CommandBehavior = CommandBehavior.RemoveByQuery,
                        Data            = new Tuple <IEnumerable <T>, IQuery>(dataList, cacheCommand.Query)
                    };
                    beforeParameter = new CommandStartingEventParameter()
                    {
                        Data            = new Tuple <IEnumerable <T>, IQuery>(dataList, cacheCommand.Query),
                        Command         = databaseCommand,
                        CommandBehavior = CommandBehavior.RemoveByQuery
                    };
                }
            }
            //remove data to cache before command execute
            if ((cacheOperationConfig.TriggerTime & DataCacheOperationTriggerTime.Before) != 0)
            {
                databaseCommand.ListenStarting(CommandStartingEventHandler <T>, beforeParameter, !cacheOperationConfig.Synchronous);
            }

            //remove data to cache after command execute
            if ((cacheOperationConfig.TriggerTime & DataCacheOperationTriggerTime.After) != 0)
            {
                databaseCommand.ListenCallback(CommandCallbackEventHandler <T>, callbackParameter);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// command cache call back
        /// </summary>
        /// <param name="parameter">command</param>
        /// <returns></returns>
        CommandCallbackEventExecuteResult CommandCallbackEventHandler <T>(CommandCallbackEventParameter parameter) where T : BaseEntity <T>, new()
        {
            if (parameter?.Command == null)
            {
                return(CommandCallbackEventExecuteResult.Default);
            }
            switch (parameter.CommandBehavior)
            {
            case CommandBehavior.Add:
                dataCachePolicy.OnAddCallback(new AddDataContext <T>()
                {
                    Datas = new List <T>(1)
                    {
                        parameter.Data as T
                    },
                    DatabaseCommand = parameter.Command
                });
                break;

            case CommandBehavior.RemoveByQuery:
                Tuple <IEnumerable <T>, IQuery> removeOption = parameter.Data as Tuple <IEnumerable <T>, IQuery>;
                dataCachePolicy.OnRemoveByQueryCallback(new RemoveByQueryContext <T>()
                {
                    DatabaseCommand = parameter.Command,
                    Datas           = removeOption?.Item1,
                    Query           = removeOption?.Item2
                });
                break;

            case CommandBehavior.UpdateByQuery:
                Tuple <Func <IQuery, List <T> >, IQuery> updateOption = parameter.Data as Tuple <Func <IQuery, List <T> >, IQuery>;
                dataCachePolicy.OnUpdateByQueryCallback(new UpdateByQueryContext <T>()
                {
                    DatabaseCommand = parameter.Command,
                    GetDatasProxy   = updateOption?.Item1,
                    Query           = updateOption?.Item2
                });
                break;

            case CommandBehavior.RemoveObjectType:
                Tuple <Func <IQuery, List <T> >, IQuery> removeAllOption = parameter.Data as Tuple <Func <IQuery, List <T> >, IQuery>;
                dataCachePolicy.OnRemoveAllCallback(new RemoveAllContext <T>()
                {
                    DatabaseCommand = parameter.Command,
                    Query           = removeAllOption?.Item2,
                    GetDatasProxy   = removeAllOption?.Item1
                });
                break;

            case CommandBehavior.UpdateObjectType:
                Tuple <Func <IQuery, List <T> >, IQuery> updateAllOption = parameter.Data as Tuple <Func <IQuery, List <T> >, IQuery>;
                dataCachePolicy.OnUpdateAllCallback(new UpdateAllContext <T>()
                {
                    DatabaseCommand = parameter.Command,
                    Query           = updateAllOption?.Item2,
                    GetDatasProxy   = updateAllOption?.Item1
                });
                break;

            case CommandBehavior.RemoveData:
                dataCachePolicy.OnRemoveCallback(new RemoveDataContext <T>()
                {
                    DatabaseCommand = parameter.Command,
                    Datas           = new List <T>(1)
                    {
                        parameter.Data as T
                    }
                });
                break;

            case CommandBehavior.Update:
                dataCachePolicy.OnUpdateCallback(new UpdateDataContext <T>()
                {
                    DatabaseCommand = parameter.Command,
                    Datas           = new List <T>(1)
                    {
                        parameter.Data as T
                    }
                });
                break;
            }
            return(CommandCallbackEventExecuteResult.Default);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Modify data by condition
        /// </summary>
        /// <typeparam name="T">Data type</typeparam>
        /// <param name="cacheCommand">Cache command</param>
        /// <param name="databaseCommand">Database command</param>
        public void ModifyDataByCondition <T>(ModifyDataByConditionCacheCommand <T> cacheCommand, ICommand databaseCommand) where T : BaseEntity <T>, new()
        {
            var query = cacheCommand.Query;
            var cacheOperationConfig = DataCacheManager.Configuration.GetDataCacheOperationConfiguration(DataOperationType.ModifyByCondition);

            if (cacheOperationConfig == null)
            {
                return;
            }
            CommandCallbackEventParameter callbackParameter = null;
            CommandStartingEventParameter beforeParameter   = null;

            if (query?.NoneCondition ?? true)
            {
                callbackParameter = new CommandCallbackEventParameter()
                {
                    Command         = databaseCommand,
                    CommandBehavior = CommandBehavior.UpdateObjectType,
                    Data            = typeof(T)
                };
                beforeParameter = new CommandStartingEventParameter()
                {
                    Command         = databaseCommand,
                    CommandBehavior = CommandBehavior.RemoveObjectType,
                    Data            = typeof(T)
                };
            }
            else if (cacheCommand.GetDataListProxy != null)
            {
                Tuple <Func <IQuery, List <T> >, IQuery> updateOption = new Tuple <Func <IQuery, List <T> >, IQuery>(cacheCommand.GetDataListProxy, cacheCommand.Query);

                #region update cache before execute command

                beforeParameter = new CommandStartingEventParameter()
                {
                    Command         = databaseCommand,
                    CommandBehavior = CommandBehavior.UpdateByQuery,
                    Data            = updateOption
                };

                #endregion

                #region update cache after execute command

                callbackParameter = new CommandCallbackEventParameter()
                {
                    CommandBehavior = CommandBehavior.UpdateByQuery,
                    Data            = updateOption,
                    Command         = databaseCommand
                };

                #endregion
            }
            //remove data to cache before command execute
            if (beforeParameter != null && (cacheOperationConfig.TriggerTime & DataCacheOperationTriggerTime.Before) != 0)
            {
                databaseCommand.ListenStarting(CommandStartingEventHandler <T>, beforeParameter, !cacheOperationConfig.Synchronous);
            }

            //remove data to cache after command execute
            if (callbackParameter != null && (cacheOperationConfig.TriggerTime & DataCacheOperationTriggerTime.After) != 0)
            {
                databaseCommand.ListenCallback(CommandCallbackEventHandler <T>, callbackParameter);
            }
        }