Пример #1
0
        public virtual async Task <T> GetByIdAsync <T>(Guid id) where T : AggregateRoot
        {
            T item = default(T);

            var isSnapshottable = typeof(ISnapshottable).IsAssignableFrom(typeof(T));

            Snapshot.Snapshot snapshot = null;

            if ((isSnapshottable) && (SnapshotStorageProvider != null))
            {
                snapshot = await SnapshotStorageProvider.GetSnapshotAsync(typeof(T), id);
            }

            if (snapshot != null)
            {
                item = ReflectionHelper.CreateInstance <T>();
                ((ISnapshottable)item).ApplySnapshot(snapshot);
                var events = await EventStorageProvider.GetEventsAsync(typeof(T), id, snapshot.Version + 1, int.MaxValue);

                item.LoadsFromHistory(events);
            }
            else
            {
                var events = (await EventStorageProvider.GetEventsAsync(typeof(T), id, 0, int.MaxValue)).ToList();

                if (!events.Any())
                {
                    return(item);
                }
                item = ReflectionHelper.CreateInstance <T>();
                item.LoadsFromHistory(events);
            }

            return(item);
        }
        public Snapshot.Snapshot GetSnapshot(Guid aggregateId)
        {
            Snapshot.Snapshot snapshot = null;

            var connection = GetEventStoreConnection();

            connection.ConnectAsync().Wait();

            JsonSerializerSettings serializerSettings = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            };

            var streamEvents = connection.ReadStreamEventsBackwardAsync(
                $"{eventNamePrefix}-{aggregateId}", 0, 1, false).Result;

            if (streamEvents.Events.Any())
            {
                var result = streamEvents.Events.FirstOrDefault();

                snapshot = JsonConvert.DeserializeObject <Snapshot.Snapshot>(
                    Encoding.UTF8.GetString(result.Event.Data), serializerSettings);
            }

            connection.Close();

            return(snapshot);
        }
Пример #3
0
 public async Task SaveAsync(Snapshot.Snapshot snapshot)
 {
     using (var conn = this._dbConnectionFactory.Get())
     {
         if (await conn.ExecuteAsync($"insert into {nameof(Snapshot)}(id,type,version,data) values(@id,@type,@version,@data)", snapshot) != 1)
         {
             throw new Exception("快照添加失败");
         }
     }
 }
Пример #4
0
 public async Task SaveAsync(Snapshot.Snapshot snapshot)
 {
     using (var conn = this._factory.Get())
     {
         if (await conn.ExecuteAsync($"insert into {nameof(Snapshot)}(id,type,version,data) values(@id,@type,@version,@data)", snapshot) != 1)
         {
             throw new SAEException($"{nameof(snapshot)} add fail");
         }
     }
 }
 public void SaveSnapshot(Snapshot.Snapshot snapshot)
 {
     if (_items.ContainsKey(snapshot.AggregateId))
     {
         _items[snapshot.AggregateId] = snapshot;
     }
     else
     {
         _items.Add(snapshot.AggregateId, snapshot);
     }
 }
        public void SaveSnapshot(Snapshot.Snapshot snapshot)
        {
            using (IRedisClient redis = clientsManager.GetClient())
            {
                JsonSerializerSettings serializerSettings = new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.All
                };

                var strSnapshot = JsonConvert.SerializeObject(snapshot, serializerSettings);

                redis.SetValue(snapshot.AggregateId.ToString(), strSnapshot);
            }
        }
Пример #7
0
        /// <summary>
        /// Applies the snapshot and updates state of the Aggregate
        /// </summary>
        /// <param name="snapshot"></param>
        public void SetSnapshot(Snapshot.Snapshot snapshot)
        {
            //Important: State changes are done here.
            //Make sure you set the CurrentVersion and LastCommittedVersions here too

            NoteSnapshot item = (NoteSnapshot)snapshot;

            this.Id                   = item.AggregateId;
            this.CurrentVersion       = item.Version;
            this.LastCommittedVersion = item.Version;
            this.CreatedDate          = item.CreatedDate;
            this.Title                = item.Title;
            this.Description          = item.Description;
            this.Category             = item.Category;
        }
Пример #8
0
        public Snapshot.Snapshot CopyDigitalToSnapshot(string name)
        {
            var snapshot = new Snapshot.Snapshot(ParentSchedule.SnapshotContent);

            snapshot.Name = name;

            var defaultLogo = Programs.FirstOrDefault()?.Logo;

            if (defaultLogo != null)
            {
                snapshot.Logo = defaultLogo.Clone <ImageSource, ImageSource>();
            }

            ParentSchedule.SnapshotContent.Snapshots.Add(snapshot);

            CopyDigitalToSnapshot(snapshot);

            return(snapshot);
        }
        public void SaveSnapshot(Snapshot.Snapshot snapshot)
        {
            var connection = GetEventStoreConnection();

            connection.ConnectAsync().Wait();

            JsonSerializerSettings serializerSettings = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            };

            var snapshotyEvent = new EventData(snapshot.Id, @snapshot.GetType().ToString(), false,
                                               Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(snapshot, serializerSettings)),
                                               Encoding.UTF8.GetBytes(snapshot.GetType().ToString()));

            connection.AppendToStreamAsync($"{eventNamePrefix}-{snapshot.AggregateId}",
                                           ExpectedVersion.Any, snapshotyEvent).Wait();

            connection.Close();
        }
        public Snapshot.Snapshot GetSnapshot(Guid aggregateId)
        {
            Snapshot.Snapshot snapshot = null;

            using (IRedisClient redis = clientsManager.GetClient())
            {
                var strSnapshot = redis.GetValue(aggregateId.ToString());

                if (strSnapshot != "")
                {
                    JsonSerializerSettings serializerSettings = new JsonSerializerSettings
                    {
                        TypeNameHandling = TypeNameHandling.All
                    };

                    snapshot = JsonConvert.DeserializeObject <Snapshot.Snapshot>(
                        strSnapshot, serializerSettings);
                }
            }

            return(snapshot);
        }
Пример #11
0
        public override void Deserialize(XmlNode rootNode)
        {
            base.Deserialize(rootNode);

            var node = rootNode.SelectSingleNode(@"ProgramSchedule");

            if (node != null)
            {
                InitProgramSchedule();
                ProgramSchedule.Deserialize(node);
            }

            node = rootNode.SelectSingleNode(@"WeeklySection");
            if (node != null && SelectedSpotType == SpotType.Week)
            {
                InitProgramSchedule();
                ProgramSchedule.DeserializeSection(node);
            }

            node = rootNode.SelectSingleNode(@"MonthlySection");
            if (node != null && SelectedSpotType == SpotType.Month)
            {
                InitProgramSchedule();
                ProgramSchedule.DeserializeSection(node);
            }

            node = rootNode.SelectSingleNode(@"DigitalProducts");
            if (node != null)
            {
                foreach (XmlNode productNode in node.ChildNodes)
                {
                    var product = new DigitalProduct();
                    product.Deserialize(productNode);
                    DigitalProducts.Add(product);
                }
            }

            node = rootNode.SelectSingleNode(@"DigitalProductSummary");
            if (node != null)
            {
                DigitalProductSummary.Deserialize(node);
            }

            node = rootNode.SelectSingleNode(@"Snapshots");
            if (node != null)
            {
                foreach (XmlNode snapshotNode in node.ChildNodes)
                {
                    var snapshot = new Snapshot.Snapshot(this);
                    snapshot.Deserialize(snapshotNode);
                    Snapshots.Add(snapshot);
                }
            }

            node = rootNode.SelectSingleNode(@"SnapshotSummary");
            if (node != null)
            {
                SnapshotSummary.Deserialize(node);
            }

            node = rootNode.SelectSingleNode(@"Options");
            if (node != null)
            {
                foreach (XmlNode optionSetNode in node.ChildNodes)
                {
                    var optionSet = new OptionSet(this);
                    optionSet.Deserialize(optionSetNode);
                    Options.Add(optionSet);
                }
            }

            node = rootNode.SelectSingleNode(@"OptionsSummary");
            if (node != null)
            {
                OptionsSummary.Deserialize(node);
            }
        }
Пример #12
0
		public override void Deserialize(XmlNode rootNode)
		{
			base.Deserialize(rootNode);

			var node = rootNode.SelectSingleNode(@"ProgramSchedule");
			if (node != null)
			{
				InitProgramSchedule();
				ProgramSchedule.Deserialize(node);
			}

			node = rootNode.SelectSingleNode(@"WeeklySection");
			if (node != null && SelectedSpotType == SpotType.Week)
			{
				InitProgramSchedule();
				ProgramSchedule.DeserializeSection(node);
			}

			node = rootNode.SelectSingleNode(@"MonthlySection");
			if (node != null && SelectedSpotType == SpotType.Month)
			{
				InitProgramSchedule();
				ProgramSchedule.DeserializeSection(node);
			}

			node = rootNode.SelectSingleNode(@"DigitalProducts");
			if (node != null)
			{
				foreach (XmlNode productNode in node.ChildNodes)
				{
					var product = new DigitalProduct();
					product.Deserialize(productNode);
					DigitalProducts.Add(product);
				}
			}

			node = rootNode.SelectSingleNode(@"DigitalProductSummary");
			if (node != null)
			{
				DigitalProductSummary.Deserialize(node);
			}

			node = rootNode.SelectSingleNode(@"Snapshots");
			if (node != null)
			{
				foreach (XmlNode snapshotNode in node.ChildNodes)
				{
					var snapshot = new Snapshot.Snapshot(this);
					snapshot.Deserialize(snapshotNode);
					Snapshots.Add(snapshot);
				}
			}

			node = rootNode.SelectSingleNode(@"SnapshotSummary");
			if (node != null)
			{
				SnapshotSummary.Deserialize(node);
			}

			node = rootNode.SelectSingleNode(@"Options");
			if (node != null)
			{
				foreach (XmlNode optionSetNode in node.ChildNodes)
				{
					var optionSet = new OptionSet(this);
					optionSet.Deserialize(optionSetNode);
					Options.Add(optionSet);
				}
			}

			node = rootNode.SelectSingleNode(@"OptionsSummary");
			if (node != null)
			{
				OptionsSummary.Deserialize(node);
			}
		}
Пример #13
0
 public Task SaveAsync(Snapshot.Snapshot snapshot)
 {
     this._store.Add(snapshot);
     return(Task.CompletedTask);
 }
Пример #14
0
 public void CopyDigitalToSnapshot(Snapshot.Snapshot targetSnapshot)
 {
     targetSnapshot.DigitalInfo = DigitalInfo.Clone <MediaDigitalInfo, MediaDigitalInfo>();
 }
Пример #15
0
        public Snapshot.Snapshot CopyScheduleToSnapshot(string name, DateTime spotDate, bool copySpots)
        {
            var snapshot = new Snapshot.Snapshot(ParentSchedule.SnapshotContent);

            snapshot.Name = name;

            var defaultLogo = Programs.FirstOrDefault()?.Logo;

            if (defaultLogo != null)
            {
                snapshot.Logo = defaultLogo.Clone <ImageSource, ImageSource>();
            }

            foreach (var program in Programs)
            {
                var snaphotProgram = new Snapshot.SnapshotProgram(snapshot);
                snaphotProgram.Name    = program.Name;
                snaphotProgram.Logo    = program.Logo.Clone <ImageSource, ImageSource>();
                snaphotProgram.Station = program.Station;
                snaphotProgram.Daypart = program.Daypart;
                snaphotProgram.Time    = program.Time;
                snaphotProgram.Length  = program.Length;
                snaphotProgram.Rate    = (Decimal?)program.Rate;

                var weekDaysRange = program.WeekDays.ToList();
                if (copySpots && weekDaysRange.Any())
                {
                    var weekDaysInOrder = new[]
                    {
                        DayOfWeek.Monday,
                        DayOfWeek.Tuesday,
                        DayOfWeek.Wednesday,
                        DayOfWeek.Thursday,
                        DayOfWeek.Friday,
                        DayOfWeek.Saturday,
                        DayOfWeek.Sunday,
                    }.ToList();

                    var firstWeekDay = weekDaysInOrder.IndexOf(weekDaysRange.First());
                    var lastWeekDay  = weekDaysInOrder.IndexOf(weekDaysRange.Count == 2 ? weekDaysRange.ElementAt(1) : weekDaysRange.First());

                    var templateSpotCount = program.Spots.FirstOrDefault(s => s.Date == spotDate)?.Count;
                    if (templateSpotCount.HasValue)
                    {
                        while (templateSpotCount > 0)
                        {
                            if (!ParentScheduleSettings.MondayBased)
                            {
                                if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Sunday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Sunday))
                                {
                                    if (!snaphotProgram.SundaySpot.HasValue)
                                    {
                                        snaphotProgram.SundaySpot = 1;
                                    }
                                    else
                                    {
                                        snaphotProgram.SundaySpot++;
                                    }
                                    templateSpotCount--;
                                }
                            }
                            if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Monday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Monday))
                            {
                                if (!snaphotProgram.MondaySpot.HasValue)
                                {
                                    snaphotProgram.MondaySpot = 1;
                                }
                                else
                                {
                                    snaphotProgram.MondaySpot++;
                                }
                                templateSpotCount--;
                            }
                            if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Tuesday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Tuesday))
                            {
                                if (!snaphotProgram.TuesdaySpot.HasValue)
                                {
                                    snaphotProgram.TuesdaySpot = 1;
                                }
                                else
                                {
                                    snaphotProgram.TuesdaySpot++;
                                }
                                templateSpotCount--;
                            }
                            if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Wednesday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Wednesday))
                            {
                                if (!snaphotProgram.WednesdaySpot.HasValue)
                                {
                                    snaphotProgram.WednesdaySpot = 1;
                                }
                                else
                                {
                                    snaphotProgram.WednesdaySpot++;
                                }
                                templateSpotCount--;
                            }
                            if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Thursday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Thursday))
                            {
                                if (!snaphotProgram.ThursdaySpot.HasValue)
                                {
                                    snaphotProgram.ThursdaySpot = 1;
                                }
                                else
                                {
                                    snaphotProgram.ThursdaySpot++;
                                }
                                templateSpotCount--;
                            }
                            if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Friday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Friday))
                            {
                                if (!snaphotProgram.FridaySpot.HasValue)
                                {
                                    snaphotProgram.FridaySpot = 1;
                                }
                                else
                                {
                                    snaphotProgram.FridaySpot++;
                                }
                                templateSpotCount--;
                            }
                            if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Saturday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Saturday))
                            {
                                if (!snaphotProgram.SaturdaySpot.HasValue)
                                {
                                    snaphotProgram.SaturdaySpot = 1;
                                }
                                else
                                {
                                    snaphotProgram.SaturdaySpot++;
                                }
                                templateSpotCount--;
                            }
                            if (ParentScheduleSettings.MondayBased)
                            {
                                if (templateSpotCount > 0 && firstWeekDay <= weekDaysInOrder.IndexOf(DayOfWeek.Sunday) && lastWeekDay >= weekDaysInOrder.IndexOf(DayOfWeek.Sunday))
                                {
                                    if (!snaphotProgram.SundaySpot.HasValue)
                                    {
                                        snaphotProgram.SundaySpot = 1;
                                    }
                                    else
                                    {
                                        snaphotProgram.SundaySpot++;
                                    }
                                    templateSpotCount--;
                                }
                            }
                        }
                    }
                }
                snapshot.Programs.Add(snaphotProgram);
            }

            ParentSchedule.SnapshotContent.Snapshots.Add(snapshot);

            return(snapshot);
        }
Пример #16
0
 /// <summary>
 /// Use this method when you are trying to load a base type, which in it self does not implement
 /// the <see cref="ISnapshottable{T}" /> interface, but  you have a snapshot indicating
 /// that you need to instantiate child type instead.
 /// </summary>
 /// <typeparam name="T">The aggregate type</typeparam>
 /// <param name="snapshot">The snapshot</param>
 /// <returns>A subclass instance as <typeparam name="T"></typeparam></returns>
 public T CreateAggregate <T>(Snapshot.Snapshot snapshot) where T : class, IAggregateRoot
 {
     return((T)_resolver.Resolve(_snapshotToTypeMap[snapshot.GetType()]));
 }