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