changeset 15:08b9e96132a5

Persistimos los eventos de la agenda
author nelo@MTEySS.neluz.int
date Mon, 14 Mar 2011 00:14:09 -0300
parents ed6d842abf42
children ed29ceb025a9
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/AgendaFactory.cs Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs Agendas/trunk/src/Agendas.Factories/Agendas.Factories.csproj Agendas/trunk/src/Agendas.Factories/Properties/AssemblyInfo.cs Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs Agendas/trunk/src/Agendas.sln
diffstat 12 files changed, 217 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -2,24 +2,23 @@
 using System.Collections.Generic;
 using System.Linq;
 using AltNetHispano.Agendas.Domain.Exceptions;
+using AltNetHispano.Agendas.Domain.Repositories;
 
 namespace AltNetHispano.Agendas.Domain
 {
 	public class Agenda
 	{
-        private readonly IList<Evento> _eventosPropuestos;
-        private readonly IList<Evento> _eventosPublicados;
 		private readonly IPublicador _publicador;
 		private readonly IRecordador _recordador;
         private readonly ISeguridad _seguridad;
+		private readonly IEventoRepository _eventosRepository;
 
-        public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad)
+		public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad, IEventoRepository eventosRepository)
 		{
 			_publicador = publicador;
+			_eventosRepository = eventosRepository;
 			_recordador = recordador;
             _seguridad = seguridad;
-			_eventosPropuestos = new List<Evento>();
-            _eventosPublicados = new List<Evento>();
 		}
 
 		public Guid Id { get; set; }
@@ -30,17 +29,14 @@
 
 			if (!evento.Fecha.HasValue)
 				throw new ValidationException();
-			if (_publicador != null)
-				_publicador.Publicar(evento);
             if (NoEstaAutenticado(_seguridad))
                 throw new UsuarioNoAutenticadoException();
             if (string.IsNullOrWhiteSpace(evento.Ponente))
                 throw new ValidationException();
 
-			//TODO: persistir el evento!
-			if (evento.Id==Guid.Empty) evento.Id = Guid.NewGuid();
-
-            _eventosPublicados.Add(evento);
+			if (_publicador != null)
+				_publicador.Publicar(evento);
+			_eventosRepository.Save(evento);
 		}
 
 		public void Recordar(Evento evento)
@@ -55,27 +51,29 @@
 				throw new ValidationException();
             if (NoEstaAutenticado(_seguridad))
                 throw new ValidationException();
-			_eventosPropuestos.Add(evento);
+			_eventosRepository.Save(evento);
 		}
 
         public IList<Evento> GetEventosPropuestos()
         {
-            return _eventosPropuestos;
+			return _eventosRepository.GetEventosSinFecha() ?? new List<Evento>();
         }
 
         public IList<Evento> GetEventosPublicados()
         {
-            return _eventosPublicados;
+            return _eventosRepository.GetEventosConFecha() ?? new List<Evento>();
         }
 
-        private static bool NoEstaAutenticado(ISeguridad seguridad) {
+        private static bool NoEstaAutenticado(ISeguridad seguridad)
+        {
+        	return false;
             return seguridad == null || seguridad.GetPrincipal() == null || seguridad.GetPrincipal().Identity == null
                 || string.IsNullOrWhiteSpace(seguridad.GetPrincipal().Identity.Name);
         }
 
 		public void ModificarEvento(Guid id, string titulo, string ponente, DateTime? fecha)
 		{
-			var evento = _eventosPublicados.SingleOrDefault(e => e.Id == id);
+			var evento = _eventosRepository.Get(id);
 			if (evento == null)
 				throw new EventoNotFoundException();
 			evento.Titulo = titulo;
@@ -85,7 +83,7 @@
 
 		public Evento GetEventoPublicado(Guid id)
 		{
-			return _eventosPublicados.SingleOrDefault(e => e.Id == id);
+			return _eventosRepository.Get(id);
 		}
 	}
 
--- a/Agendas/trunk/src/Agendas.Domain/AgendaFactory.cs	Sun Mar 13 20:49:15 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-namespace AltNetHispano.Agendas.Domain
-{
-    public static class AgendaFactory
-    {
-        private static readonly Agenda Agenda = new Agenda(null, null, null);
-
-        public static Agenda GetAgenda()
-        {
-            return Agenda;
-        }
-    }
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Mon Mar 14 00:14:09 2011 -0300
@@ -41,7 +41,6 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Agenda.cs" />
-    <Compile Include="AgendaFactory.cs" />
     <Compile Include="CompositePublicador.cs" />
     <Compile Include="Evento.cs" />
     <Compile Include="Exceptions\ValidationException.cs" />
--- a/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 
 namespace AltNetHispano.Agendas.Domain.Repositories
 {
@@ -8,7 +9,9 @@
 		void Delete(Evento evento);
 		void Update(Evento evento);
         Evento Get(Guid vanId);
-    }
+		IList<Evento> GetEventosSinFecha();
+		IList<Evento> GetEventosConFecha();
+	}
 
 	public interface IAgendaRepository
 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -0,0 +1,15 @@
+using Agendas.Repositories.Memory;
+using AltNetHispano.Agendas.Domain;
+
+namespace Agendas.Factories
+{
+    public static class AgendaFactory
+    {
+		private static readonly Agenda Agenda = new Agenda(null, null, null, new EventoRepository());
+
+        public static Agenda GetAgenda()
+        {
+            return Agenda;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Factories/Agendas.Factories.csproj	Mon Mar 14 00:14:09 2011 -0300
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{306DDA8A-49A5-42E5-A639-A9D3D521865F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Agendas.Factories</RootNamespace>
+    <AssemblyName>Agendas.Factories</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AgendaFactory.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Agendas.Domain\Agendas.Domain.csproj">
+      <Project>{A14907DF-02E4-4FA7-BE27-4292AF50AA22}</Project>
+      <Name>Agendas.Domain</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Agendas.Repositories.Memory\Agendas.Repositories.Memory.csproj">
+      <Project>{28C5EBFB-EE69-4765-A880-D4DE0BC89F48}</Project>
+      <Name>Agendas.Repositories.Memory</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Factories/Properties/AssemblyInfo.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Agendas.Factories")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Agendas.Factories")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7faa52b9-f17e-40d4-87a8-8b97ea19b946")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -1,4 +1,6 @@
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
 
@@ -31,5 +33,14 @@
             return Objects.TryGetValue(vanId, out evento) ? evento : null;
         }
 
+		public IList<Evento> GetEventosSinFecha()
+		{
+			return Objects.Values.Where(e => e.Fecha == null).ToList();
+		}
+
+		public IList<Evento> GetEventosConFecha()
+		{
+			return Objects.Values.Where(e => e.Fecha != null).ToList();
+		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -23,12 +23,23 @@
             }
 	    }
 
+		[SetUp]
+		public void LimpiarEventos()
+		{
+			var repository = new EventoRepository();
+			foreach (var evento in repository.GetEventosConFecha())
+				repository.Delete(evento);
+			foreach (var evento in repository.GetEventosSinFecha())
+				repository.Delete(evento);
+		}
+
 		[Test]
 		public void Publicar_van_con_usuario_autenticado()
 		{
 			var publicador = new Mock<IPublicador>();
+			var repository = new EventoRepository();
 
-            var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault);
+            var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository);
 
 			var van = EventoObjectMother.GetVanValidaParaPublicar();
 
@@ -41,42 +52,51 @@
         [Test]
         public void Publicar_van_sin_usuario_autenticado() {
             var seguridad = new Mock<ISeguridad>();
-            var publicador = new Mock<IPublicador>();
+			seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalSinAutenticar());
 
-            var agenda = new Agenda(publicador.Object, null, seguridad.Object);
+			var publicador = new Mock<IPublicador>();
+			var repository = new Mock<IEventoRepository>();
+
+			var agenda = new Agenda(publicador.Object, null, seguridad.Object, repository.Object);
 
             var van = EventoObjectMother.GetVanValidaParaPublicar();
 
-            seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalSinAutenticar());
+            Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
 
-            Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
-        }
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(0));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
+		}
 
         [Test]
         public void Publicar_van_sin_servicio_de_seguridad()
         {
             var publicador = new Mock<IPublicador>();
+			var repository = new Mock<IEventoRepository>();
 
-            var agenda = new Agenda(publicador.Object, null, null);
+			var agenda = new Agenda(publicador.Object, null, null, repository.Object);
 
             var van = EventoObjectMother.GetVanValidaParaPublicar();
 
             Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
-        }
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
+		}
 
 		[Test]
 		public void Error_al_publicar_van()
 		{
 			var publicador = new Mock<IPublicador>();
+			var repository = new Mock<IEventoRepository>();
+
 			publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Throws(new Exception("Error intencional"));
 
-			var agenda = new Agenda(publicador.Object, null, null);
+			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository.Object);
 
 			var van = EventoObjectMother.GetVanValidaParaPublicar();
             Assert.Throws<Exception>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
 			Assert.AreEqual(0, agenda.GetEventosPublicados().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
 
 		[Test]
@@ -85,23 +105,28 @@
 			var publicador1 = new Mock<IPublicador>();
 			var publicador2 = new Mock<IPublicador>();
 
-            var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault);
+			var repository = new Mock<IEventoRepository>();
+
+            var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault, repository.Object);
 
 			var van = EventoObjectMother.GetVanValidaParaPublicar();
             agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
 			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1));
 		}
 
 		[Test]
 		public void Publicar_y_recordar_van()
 		{
+			var repository = new Mock<IEventoRepository>();
+
 			var publicador1 = new Mock<IPublicador>();
 			var publicador2 = new Mock<IPublicador>();
 			var recordador1 = new Mock<IRecordador>();
 
-            var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault);
+            var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault, repository.Object);
 
 			var van = EventoObjectMother.GetVanValidaParaPublicar();
             agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
@@ -112,16 +137,18 @@
 			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
 			recordador1.Verify(r => r.Recordar(It.IsAny<Evento>()), Times.Exactly(1));
 
-			Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1));
 		}
 
 		[Test]
 		public void Propuesta_de_van_con_usuario_autenticado()
 		{
-			var van = new Evento{Titulo = "Van propuesta"};
+			var repository = new EventoRepository();
+
+			var van = new Evento { Titulo = "Van propuesta" };
 
             var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object);
+            var agenda = new Agenda(null, null, seguridad.Object, repository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 			agenda.Proponer(van);
@@ -135,8 +162,8 @@
         [Test]
         public void Verificar_propuesta_separada_de_publicacion()
         {
-            var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object);
+			var seguridad = new Mock<ISeguridad>();
+            var agenda = new Agenda(null, null, seguridad.Object, new EventoRepository());
 
             var vanPropuesta = new Evento { Titulo = "Van propuesta" };
             var vanPublicada = EventoObjectMother.GetVanValidaParaPublicar();
@@ -150,25 +177,30 @@
 
             Assert.AreEqual(1, eventosPropuestos.Count);
             Assert.AreEqual(1, eventosPublicados.Count);
-        }
+		}
 
 		[Test]
 		public void Propuesta_de_van_sin_titulo()
 		{
+			var repository = new Mock<IEventoRepository>();
 			var van = new Evento();
 
             var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object);
+            var agenda = new Agenda(null, null, seguridad.Object, repository.Object);
             
             Assert.Throws<ValidationException>(() => agenda.Proponer(van));
 			Assert.AreEqual(Guid.Empty, van.Id);
+
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
 
 		[Test]
 		public void Agendar_van_propuesta_sin_fecha()
 		{
-            var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object);
+			var repository = new EventoRepository();
+			
+			var seguridad = new Mock<ISeguridad>();
+            var agenda = new Agenda(null, null, seguridad.Object, repository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 
@@ -187,8 +219,10 @@
 		[Test]
 		public void Agendar_van_propuesta_sin_ponente()
 		{
-            var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object);
+			var repository = new EventoRepository();
+						
+			var seguridad = new Mock<ISeguridad>();
+            var agenda = new Agenda(null, null, seguridad.Object, repository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 
@@ -209,11 +243,11 @@
 		[Test]
 		public void Van_crud()
 		{
-            var van = EventoObjectMother.GetVanValidaParaPublicar();
+			var van = EventoObjectMother.GetVanValidaParaPublicar();
             
             Guid vanId;
 			{
-                var agenda = new Agenda(null, null, SeguridadServiceDefault);
+                var agenda = new Agenda(null, null, SeguridadServiceDefault, new EventoRepository());
                 agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
 
 				IAgendaRepository agendaRepository = new AgendaRepository();
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Mon Mar 14 00:14:09 2011 -0300
@@ -69,7 +69,9 @@
   </ItemGroup>
   <ItemGroup>
     <Content Include="Global.asax" />
-    <Content Include="Web.config" />
+    <Content Include="Web.config">
+      <SubType>Designer</SubType>
+    </Content>
     <Content Include="Web.Debug.config">
       <DependentUpon>Web.config</DependentUpon>
     </Content>
@@ -135,6 +137,10 @@
       <Project>{A14907DF-02E4-4FA7-BE27-4292AF50AA22}</Project>
       <Name>Agendas.Domain</Name>
     </ProjectReference>
+    <ProjectReference Include="..\Agendas.Factories\Agendas.Factories.csproj">
+      <Project>{306DDA8A-49A5-42E5-A639-A9D3D521865F}</Project>
+      <Name>Agendas.Factories</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <Content Include="Views\Agenda\Edit.cshtml" />
--- a/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs	Mon Mar 14 00:14:09 2011 -0300
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Web.Mvc;
+using Agendas.Factories;
 using Agendas.Web.Models;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Exceptions;
--- a/Agendas/trunk/src/Agendas.sln	Sun Mar 13 20:49:15 2011 -0300
+++ b/Agendas/trunk/src/Agendas.sln	Mon Mar 14 00:14:09 2011 -0300
@@ -13,6 +13,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agendas.Web", "Agendas.Web\Agendas.Web.csproj", "{319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agendas.Factories", "Agendas.Factories\Agendas.Factories.csproj", "{306DDA8A-49A5-42E5-A639-A9D3D521865F}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -43,6 +45,10 @@
 		{319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{306DDA8A-49A5-42E5-A639-A9D3D521865F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{306DDA8A-49A5-42E5-A639-A9D3D521865F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{306DDA8A-49A5-42E5-A639-A9D3D521865F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{306DDA8A-49A5-42E5-A639-A9D3D521865F}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE