diff Agendas/trunk/src/Agendas.Domain/Evento.cs @ 101:9bfdd5bf3ad2

Manejo de estados de los Eventos mediante state pattern (primer version)
author jorge.rowies
date Sun, 05 Jun 2011 11:10:32 -0300
parents 2434c2323f3d
children 23325dddddcc
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Sat Jun 04 22:46:06 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -8,6 +8,7 @@
 		protected Evento()
 		{
 			_tracks = new List<Track>();
+		  _estado = new EventoNullState(this);
 		}
 
 		#region Propiedades del Evento
@@ -53,20 +54,32 @@
 			get { return _tracks; }
 		}
 
-		#endregion
+	  private EventoState _estado;
+
+	  /// <summary>
+    /// Estado del evento
+    /// </summary>
+    public virtual EventoState Estado
+	  {
+	    get { return _estado; }
+	    protected internal set { _estado = value; }
+	  }
+
+	  #endregion
 
 		#region Acciones sobre el evento
 
-		/// <summary>
-		/// Propone un evento
-		/// </summary>
-		/// <param name="titulo">Título del evento propuesto</param>
-		/// <param name="persona">Ponente para evento propuesto</param>
-		/// <returns></returns>
-		public static Evento Proponer(string titulo, Persona persona, string urlInvitacion)
+	  /// <summary>
+	  /// Propone un evento
+	  /// </summary>
+	  /// <param name="titulo">Título del evento propuesto</param>
+	  /// <param name="persona">Ponente para evento propuesto</param>
+    /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
+	  /// <returns></returns>
+	  public static Evento Proponer(string titulo, Persona persona, string urlInvitacion)
 		{
 			var evento = new Evento {Titulo = titulo, Ponente = persona, UrlInvitacion = urlInvitacion};
-			evento.AddTrack(new Track(evento, Accion.Proponer));
+      evento.Estado.Promover(Accion.Proponer);
 
 			return evento;
 		}
@@ -82,7 +95,7 @@
 		public static Evento Agendar(string titulo, Persona persona, DateTime fecha, string urlInvitacion)
 		{
 			var evento = new Evento { Titulo = titulo };
-			evento.Agendar(persona, fecha, urlInvitacion);
+      evento.Agendar(persona, fecha, urlInvitacion);
 
 			return evento;
 		}
@@ -98,7 +111,7 @@
 			Ponente = persona;
 			Fecha = fecha;
 			UrlInvitacion = urlInvitacion;
-			AddTrack(new Track(this, Accion.Agendar));
+      this.Estado.Promover(Accion.Agendar);
 		}
 
 		public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion)
@@ -118,17 +131,17 @@
 
 		public virtual void Confirmar()
 		{
-			AddTrack(new Track(this, Accion.Confirmar));
+      this.Estado.Promover(Accion.Confirmar);
 		}
 
 		public virtual void Publicar()
 		{
-			AddTrack(new Track(this, Accion.Publicar));
+      this.Estado.Promover(Accion.Publicar);
 		}
 
 		#endregion
 
-		private void AddTrack(Track track)
+		protected internal virtual void AddTrack(Track track)
 		{
 			_newTracks.Add(track);
 			_tracks.Add(track);