alexgman
7/15/2015 - 5:06 PM

MySaga.cs

namespace FunWithMassTransit
{
	using System;
	using System.Linq.Expressions;
	using Magnum.StateMachine;
	using MassTransit;
	using MassTransit.Saga;
	using Messages;
	using log4net;

	class MySaga: SagaStateMachine<MySaga>, ISaga
	{
		private static readonly ILog _logger = LogManager.GetLogger(typeof(MySaga));
		private readonly DateTime _startTime = DateTime.Now;
		private static readonly TimeSpan _maxTime = TimeSpan.FromSeconds(5);
		static MySaga()
		{
			Define(() =>
			{
				Initially(When(Message).Then((saga, message)=> saga.AddMessage(message)).TransitionTo(Collecting));
				During(Collecting, When(Message).Then((saga, message) => 
					saga.AddMessage(message)));
				Correlate(Message).By((saga, message) => (DateTime.Now - saga.StartTime < _maxTime));
			});
		}

		private void AddMessage(MyMessage message)
		{
			_logger.Info("Message added to saga " + CorrelationId);
		}

		public static State Initial { get; set; }
		public static State Completed { get; set; }
		public static State Collecting { get; set; }
		public static Event<MyMessage> Message { get; set; }
		public MySaga(Guid guid)
		{
			_logger.Info("Started Saga with GUID " + guid);
			CorrelationId = guid;
		}
		public DateTime StartTime
		{
			get { return _startTime; }
		}

		public Guid CorrelationId { get; set; }

		public IServiceBus Bus { get; set; }
	}
}