public static async ETTask <T> Update <T>(this RedisEventSolverComponent self, T entity) where T : ComponentWithId
        {
            if (self.isDebug)
            {
                OtherHelper.LogCallStackMessage("Update");
            }

            var result = await self.cacheProxyComponent.UpdateById(entity);

            T returnData = default;

            if (result != default)
            {
                var msg = CacheHelper.ConvertRedisPublish2Message(entity.Id, IdGenerater.AppId);
                await self.redisPubClient.GetSubscriber().PublishAsync(self.channelUpdateKey, msg);

                // 保證底層Data的Reference一致
                self.Write(entity.Id, entity);
                returnData = (T)self.Data[entity.Id];
                // 觸發事件
                self.onRefresh?.Invoke(entity.Id);
                self.onUpdate?.Invoke(entity.Id);
            }
            return(returnData);
        }
        public static async ETTask <T> Create <T>(this RedisEventSolverComponent self, T entity) where T : ComponentWithId
        {
            if (self.isDebug)
            {
                OtherHelper.LogCallStackMessage("Create");
            }

            var result = await self.cacheProxyComponent.Create(entity);

            T returnData = default;

            if (result != default)
            {
                var msg = CacheHelper.ConvertRedisPublish2Message(entity.Id, IdGenerater.AppId);
                await self.redisPubClient.GetSubscriber().PublishAsync(self.channelCreateKey, msg);

                // 誰創的誰就是物件的擁有者
                // 如果是自己產生的事件循環自己管,即你用系統CreateWithId產生的有事件循環,自己new的沒有,都依自己傳來的entity怎麼生的
                self.Data[entity.Id] = entity;
                self.mineSet.Add(entity.Id);
                returnData = entity;
                // 觸發事件
                self.onRefresh?.Invoke(entity.Id);
                self.onCreate?.Invoke(entity.Id);
            }
            return(returnData);
        }
        /// <summary>
        /// 刪除快取同步物件
        /// 盡量在函式的最後呼叫,怕Dispose先呼叫後,把刪除後一些後續動作要用到的欄位給初始化掉了
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="self"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public static async ETTask <bool> Delete <T>(this RedisEventSolverComponent self, long id) where T : ComponentWithId
        {
            if (self.isDebug)
            {
                OtherHelper.LogCallStackMessage("Delete");
            }

            var result = await self.cacheProxyComponent.QueryById <T>(id);

            var isSucc = false;

            if (result != default)
            {
                isSucc = await self.cacheProxyComponent.DeleteById <T>(id);

                if (isSucc)
                {
                    var msg   = CacheHelper.ConvertRedisPublish2Message(id, IdGenerater.AppId);
                    var count = await self.redisPubClient.GetSubscriber().PublishAsync(self.channelDeleteKey, msg);

                    self.onWillDelete?.Invoke(id);
                    if (self.Data.TryGetValue(id, out var component))
                    {
                        component.Dispose();
                        self.Data.Remove(id);
                        self.mineSet.Remove(id);
                    }
                    // 觸發事件
                    self.onRefresh?.Invoke(id);
                    self.onDelete?.Invoke(id);
                }
                else
                {
                    Log.Warning($"to delete cache is failed! object has deleted on {typeof(T).Name}[{id}]");
                }
            }

            return(isSucc);
        }