public static async ETTask <bool> DestroyReservation(this ReservationComponent self, long reservationId)
        {
            if (self._RemoveReservation(reservationId))
            {
                await self.MemorySync.Delete <Reservation>(reservationId);

                return(true);
            }
            return(false);
        }
        public static async ETTask <Reservation> CreateReservation(this ReservationComponent self, ReservationAllData reservationData)
        {
            Reservation reservation = ComponentFactory.CreateWithId <Reservation>(reservationData.ReservationId);

            reservation.SetData(reservationData);
            await self.MemorySync.Create(reservation);

            reservation.IsInitialized = true;
            return(reservation);
        }
        private static void OnCreated(this ReservationComponent self, long id)
        {
            //if (self.MemorySync.IsMine(id))
            //    return;
            Reservation reservation = self.MemorySync.Get <Reservation>(id);

            if (reservation == null)
            {
                // GG跑到這邊表示有問題
                Log.Error($"Reservation[{id}] is missing!");
            }
            else
            {
                self._AddReservation(reservation);
            }
        }
        public static void Destroy(this ReservationComponent self)
        {
            if (self.IsDisposed)
            {
                return;
            }
            self.Dispose();

            foreach (Reservation reservation in self._idReservationDict.Values)
            {
                reservation.Dispose();
            }
            self._idReservationDict.Clear();
            self._uIdReservationDict.Clear();

            self.MemorySync.onCreate     -= self.OnCreated;
            self.MemorySync.onWillDelete -= self.OnWillDeleted;
            // 非擁有者請勿操作Dispose
            self.MemorySync.Dispose();
        }
        public static async void Start(this ReservationComponent self)
        {
            var proxy = Game.Scene.GetComponent <CacheProxyComponent>();

            self.MemorySync               = proxy.GetMemorySyncSolver <Reservation>();
            self.MemorySync.onCreate     += self.OnCreated;
            self.MemorySync.onWillDelete += self.OnWillDeleted;

            var reservations = await ReservationDataHelper.GetAll();

            for (int i = 0; i < reservations.Count; i++)
            {
                if (reservations[i].allData == null)
                {
                    await ReservationDataHelper.Remove(reservations[i].uid);

                    continue;
                }

                // 解析預約
                ReservationAllData allData          = new ReservationAllData();
                CodedInputStream   codedInputStream = new CodedInputStream(reservations[i].allData.Bytes);
                allData.MergeFrom(codedInputStream);

                // 判斷是否過期
                if (DateTime.UtcNow.Ticks > allData.AwakeUTCTimeTick)
                {
                    await ReservationDataHelper.Remove(reservations[i].uid);

                    continue;
                }

                // 實體化預約
                await self.CreateReservation(allData);
            }
        }
        public static async ETTask <bool> UpdateReservation(this ReservationComponent self, Reservation reservation)
        {
            var obj = await self.MemorySync.Update(reservation);

            return(obj != null);
        }