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