comparison 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
comparison
equal deleted inserted replaced
100:cc91817a4206 101:9bfdd5bf3ad2
6 public class Evento : Identificable 6 public class Evento : Identificable
7 { 7 {
8 protected Evento() 8 protected Evento()
9 { 9 {
10 _tracks = new List<Track>(); 10 _tracks = new List<Track>();
11 _estado = new EventoNullState(this);
11 } 12 }
12 13
13 #region Propiedades del Evento 14 #region Propiedades del Evento
14 15
15 private readonly IList<Track> _tracks; 16 private readonly IList<Track> _tracks;
51 public virtual IEnumerable<Track> Tracks 52 public virtual IEnumerable<Track> Tracks
52 { 53 {
53 get { return _tracks; } 54 get { return _tracks; }
54 } 55 }
55 56
56 #endregion 57 private EventoState _estado;
58
59 /// <summary>
60 /// Estado del evento
61 /// </summary>
62 public virtual EventoState Estado
63 {
64 get { return _estado; }
65 protected internal set { _estado = value; }
66 }
67
68 #endregion
57 69
58 #region Acciones sobre el evento 70 #region Acciones sobre el evento
59 71
60 /// <summary> 72 /// <summary>
61 /// Propone un evento 73 /// Propone un evento
62 /// </summary> 74 /// </summary>
63 /// <param name="titulo">Título del evento propuesto</param> 75 /// <param name="titulo">Título del evento propuesto</param>
64 /// <param name="persona">Ponente para evento propuesto</param> 76 /// <param name="persona">Ponente para evento propuesto</param>
65 /// <returns></returns> 77 /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
66 public static Evento Proponer(string titulo, Persona persona, string urlInvitacion) 78 /// <returns></returns>
79 public static Evento Proponer(string titulo, Persona persona, string urlInvitacion)
67 { 80 {
68 var evento = new Evento {Titulo = titulo, Ponente = persona, UrlInvitacion = urlInvitacion}; 81 var evento = new Evento {Titulo = titulo, Ponente = persona, UrlInvitacion = urlInvitacion};
69 evento.AddTrack(new Track(evento, Accion.Proponer)); 82 evento.Estado.Promover(Accion.Proponer);
70 83
71 return evento; 84 return evento;
72 } 85 }
73 86
74 /// <summary> 87 /// <summary>
80 /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param> 93 /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
81 /// <returns></returns> 94 /// <returns></returns>
82 public static Evento Agendar(string titulo, Persona persona, DateTime fecha, string urlInvitacion) 95 public static Evento Agendar(string titulo, Persona persona, DateTime fecha, string urlInvitacion)
83 { 96 {
84 var evento = new Evento { Titulo = titulo }; 97 var evento = new Evento { Titulo = titulo };
85 evento.Agendar(persona, fecha, urlInvitacion); 98 evento.Agendar(persona, fecha, urlInvitacion);
86 99
87 return evento; 100 return evento;
88 } 101 }
89 102
90 /// <summary> 103 /// <summary>
96 public virtual void Agendar(Persona persona, DateTime? fecha, string urlInvitacion) 109 public virtual void Agendar(Persona persona, DateTime? fecha, string urlInvitacion)
97 { 110 {
98 Ponente = persona; 111 Ponente = persona;
99 Fecha = fecha; 112 Fecha = fecha;
100 UrlInvitacion = urlInvitacion; 113 UrlInvitacion = urlInvitacion;
101 AddTrack(new Track(this, Accion.Agendar)); 114 this.Estado.Promover(Accion.Agendar);
102 } 115 }
103 116
104 public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion) 117 public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion)
105 { 118 {
106 Ponente = persona; 119 Ponente = persona;
116 AddTrack(new Track(this, Accion.CambiarTitulo)); 129 AddTrack(new Track(this, Accion.CambiarTitulo));
117 } 130 }
118 131
119 public virtual void Confirmar() 132 public virtual void Confirmar()
120 { 133 {
121 AddTrack(new Track(this, Accion.Confirmar)); 134 this.Estado.Promover(Accion.Confirmar);
122 } 135 }
123 136
124 public virtual void Publicar() 137 public virtual void Publicar()
125 { 138 {
126 AddTrack(new Track(this, Accion.Publicar)); 139 this.Estado.Promover(Accion.Publicar);
127 } 140 }
128 141
129 #endregion 142 #endregion
130 143
131 private void AddTrack(Track track) 144 protected internal virtual void AddTrack(Track track)
132 { 145 {
133 _newTracks.Add(track); 146 _newTracks.Add(track);
134 _tracks.Add(track); 147 _tracks.Add(track);
135 } 148 }
136 149