# HG changeset patch # User jorge.rowies # Date 1307283032 10800 # Node ID 9bfdd5bf3ad245a97c3149310f61a4a7d548ccb7 # Parent cc91817a4206b02e9dbc6e0dc5dd2c6ad3a3a2a6 Manejo de estados de los Eventos mediante state pattern (primer version) diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj --- 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 @@ + + + + + + + diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/Evento.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(); + _estado = new EventoNullState(this); } #region Propiedades del Evento @@ -53,20 +54,32 @@ get { return _tracks; } } - #endregion + private EventoState _estado; + + /// + /// Estado del evento + /// + public virtual EventoState Estado + { + get { return _estado; } + protected internal set { _estado = value; } + } + + #endregion #region Acciones sobre el evento - /// - /// Propone un evento - /// - /// Título del evento propuesto - /// Ponente para evento propuesto - /// - public static Evento Proponer(string titulo, Persona persona, string urlInvitacion) + /// + /// Propone un evento + /// + /// Título del evento propuesto + /// Ponente para evento propuesto + /// Url con la invitación realizada por el ponente + /// + 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); diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/EventoAgendadoState.cs --- /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 diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/EventoConfirmadoState.cs --- /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 diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/EventoNullState.cs --- /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 diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/EventoPropuestoState.cs --- /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 diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/EventoPublicadoState.cs --- /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 diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/EventoState.cs --- /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); + } +} diff -r cc91817a4206 -r 9bfdd5bf3ad2 Agendas/trunk/src/Agendas.Domain/Exceptions/AccionNoSoportadaException.cs --- /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