Tecnologías

TDD / DDD / IRepository / Patrones / NHibernate / NUnit / C# / Linq / Net 3.5 / BDO 

Linq to SQL

Está muerto ?Colonia

Aparentemente Microsoft esta dejando de lado LinqToSql  por su variedad en esteroides Entity Framework (voy a ver si puedo traducir este post al E/F). Un buen punto de partida sobre esta discusión es blog del buen Ayende (mucho tiempo con colombianos, ya digo "el buen", jaja) y en particular este post.


Helper?

Lo primero que debemos hacer es agregar al proyecto de implementación un ítem del tipo Linq to Sql classes. Y allí utilizando el editor crear el contexto con nuestras clases.

En el caso de la implementación para LinqToSql utilizamos en vez de un helper métodos en la implementación que nos proveen el DataContext y las tablas.

    public class Repository<T> : IRepository<T> where T : class
    {
        private DomainDataContext domainDataContext = null;
        public Repository()
        {
            domainDataContext = new DomainDataContext();
        }
        /// <summary>
        /// Gets the table provided by the type T and returns for querying
        /// </summary>
        private Table<T> Table
        {
            get { return domainDataContext.GetTable<T>(); }
        }








Tests de la implementación de LinqToSql









Testando los diferentes métodos del Repositorio.









        [Test]
        public void CanSave()
        { 
            // Arrange
            IRepository<Person> repository = new Repository<Person>();
            ResetDB(repository);
            Person person = new Person { FirstName = "Chapita", LastName = "Velazquez" };
            
            // Act
            repository.Save(person);
           
            // Assert
            Person personFromDB = repository
                .GetAll()
                .Where(p => p.FirstName == "Chapita" && p.LastName == "Velazquez")
                .FirstOrDefault();
            Assert.AreEqual(personFromDB.FirstName, person.FirstName);
            Assert.AreEqual(personFromDB.LastName, person.LastName);
        }








Una vez que sabemos que el test no funciona implementamos la funcionalidad.









        public void Save(T item)
        {
            if (!Table.Contains(item))
            {
                Table.InsertOnSubmit(item);
            }
            domainDataContext.SubmitChanges();
        }








Esto también nos muestra otro de los beneficios de TDD, y es la posibilidad de generar dise;os compactos, donde la funcionalidad es exclusivamente la necesaria para satisfacer el test.




Muestro la implementación del Find para tener una idea del uso extensivo de Linq en nuestra implementación.
















       public IQueryable<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> expression)
        {
            return GetAll()
                .Where(expression);
        }








UPDATE: se puede bajar el código desde NetIRepository









Lo que sigue









En el próximo post me voy a ocupar un poco de como utilizar el repositorio desde servicios y por medio de ellos en las distintas tecnologías de presentación.