changeset 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 cc91817a4206
children 92c5a12015f3
files Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Domain/EventoAgendadoState.cs Agendas/trunk/src/Agendas.Domain/EventoConfirmadoState.cs Agendas/trunk/src/Agendas.Domain/EventoNullState.cs Agendas/trunk/src/Agendas.Domain/EventoPropuestoState.cs Agendas/trunk/src/Agendas.Domain/EventoPublicadoState.cs Agendas/trunk/src/Agendas.Domain/EventoState.cs Agendas/trunk/src/Agendas.Domain/Exceptions/AccionNoSoportadaException.cs
diffstat 9 files changed, 191 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Sat Jun 04 22:46:06 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Sun Jun 05 11:10:32 2011 -0300
@@ -40,10 +40,17 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="EventoAgendadoState.cs" />
+    <Compile Include="EventoConfirmadoState.cs" />
+    <Compile Include="EventoNullState.cs" />
+    <Compile Include="EventoPropuestoState.cs" />
+    <Compile Include="EventoPublicadoState.cs" />
+    <Compile Include="Exceptions\AccionNoSoportadaException.cs" />
     <Compile Include="Agenda.cs" />
     <Compile Include="CompositePublicador.cs" />
     <Compile Include="Cuenta.cs" />
     <Compile Include="Evento.cs" />
+    <Compile Include="EventoState.cs" />
     <Compile Include="Exceptions\EventoNotFoundException.cs" />
     <Compile Include="Exceptions\IdentityContextNotConfiguredException.cs" />
     <Compile Include="Exceptions\UsuarioNoAutenticadoException.cs" />
--- 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);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/EventoAgendadoState.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,27 @@
+using AltNetHispano.Agendas.Domain.Exceptions;
+
+namespace AltNetHispano.Agendas.Domain
+{
+  public class EventoAgendadoState : EventoState
+  {
+    private readonly Evento _evento;
+
+    public EventoAgendadoState(Evento evento)
+    {
+      _evento = evento;
+      _evento.AddTrack(new Track(_evento, Accion.Agendar));
+    }
+
+    public override void Promover(Accion accion)
+    {
+      switch (accion)
+      {
+        case Accion.Confirmar:
+          _evento.Estado = new EventoConfirmadoState(_evento);
+          break;
+        default:
+          throw new AccionNoSoportadaException(this.GetType(), accion);
+      }
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/EventoConfirmadoState.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,27 @@
+using AltNetHispano.Agendas.Domain.Exceptions;
+
+namespace AltNetHispano.Agendas.Domain
+{
+  public class EventoConfirmadoState : EventoState
+  {
+    private readonly Evento _evento;
+
+    public EventoConfirmadoState(Evento evento)
+    {
+      _evento = evento;
+      _evento.AddTrack(new Track(_evento, Accion.Confirmar));
+    }
+
+    public override void Promover(Accion accion)
+    {
+      switch (accion)
+      {
+        case Accion.Publicar:
+          _evento.Estado = new EventoPublicadoState(_evento);
+          break;
+        default:
+          throw new AccionNoSoportadaException(this.GetType(), accion);
+      }
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/EventoNullState.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,29 @@
+using AltNetHispano.Agendas.Domain.Exceptions;
+
+namespace AltNetHispano.Agendas.Domain
+{
+  public class EventoNullState : EventoState
+  {
+    private readonly Evento _evento;
+
+    public EventoNullState(Evento evento)
+    {
+      _evento = evento;
+    }
+
+    public override void Promover(Accion accion)
+    {
+      switch (accion)
+      {
+        case Accion.Proponer:
+          _evento.Estado = new EventoPropuestoState(_evento);
+          break;
+        case Accion.Agendar:
+          _evento.Estado = new EventoAgendadoState(_evento);
+          break;
+        default:
+          throw new AccionNoSoportadaException(this.GetType(), accion);
+      }
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/EventoPropuestoState.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,27 @@
+using AltNetHispano.Agendas.Domain.Exceptions;
+
+namespace AltNetHispano.Agendas.Domain
+{
+  public class EventoPropuestoState : EventoState
+  {
+    private readonly Evento _evento;
+
+    public EventoPropuestoState(Evento evento)
+    {
+      _evento = evento;
+      _evento.AddTrack(new Track(_evento, Accion.Proponer));
+    }
+
+    public override void Promover(Accion accion)
+    {
+      switch (accion)
+      {
+        case Accion.Agendar:
+          _evento.Estado = new EventoAgendadoState(_evento);
+          break;
+        default:
+          throw new AccionNoSoportadaException(this.GetType(), accion);
+      }
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/EventoPublicadoState.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,20 @@
+using AltNetHispano.Agendas.Domain.Exceptions;
+
+namespace AltNetHispano.Agendas.Domain
+{
+  public class EventoPublicadoState : EventoState
+  {
+    private readonly Evento _evento;
+
+    public EventoPublicadoState(Evento evento)
+    {
+      _evento = evento;
+      _evento.AddTrack(new Track(_evento, Accion.Publicar));
+    }
+
+    public override void Promover(Accion accion)
+    {
+      throw new AccionNoSoportadaException(this.GetType(), accion);
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/EventoState.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace AltNetHispano.Agendas.Domain
+{
+  public abstract class EventoState
+  {
+    public abstract void Promover(Accion accion);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/Exceptions/AccionNoSoportadaException.cs	Sun Jun 05 11:10:32 2011 -0300
@@ -0,0 +1,15 @@
+using System;
+using System.Globalization;
+
+namespace AltNetHispano.Agendas.Domain.Exceptions
+{
+  public class AccionNoSoportadaException : Exception
+  {
+    public AccionNoSoportadaException(Type stateType, Accion accion) :
+      base(string.Format(CultureInfo.InvariantCulture, 
+                         "No se puede realizar la accion '{0}' en el estado '{1}'",
+                         accion, stateType.Name))
+    {
+    }
+  }
+}
\ No newline at end of file