Mercurial > altnet-hispano
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