Archive for July 8, 2009

UnitOfWork y claridad en el código

He estado jugando un poco con el concepto de UnitOfWork y luego de revisar varias implementaciones (de las cuales muchas no me gustaron!) y terminar haciendo la propia, me gusta la forma en que quedó todo!

Para muestra un boton! Imagínense que necesitan que sus repositorios funcionen de forma “transaccional” que tal esto?

UnitOfWork.BeginTransaction();
var user = userRepository.GetById(id);
memberRepository.AddUser(user);
userRepository.Delete(user);
UnitOfWork.Commit();

Jugando un poco con la framework luego de un rato, me gusta mas la forma que ahora tiene :P (lambda expressions are so sweet!)

DoIt.In.Transaction(() => {
    var user = userRepository.GetById(id);
    memberRepository.AddUser(user);
    userRepository.Delete(user);
);

Próximo paso? soportar simples atributos de [Transactional] en el método…

PD: Aun no estoy seguro de como ponerle al “DoIt”

Generating NHibernate Database Schema with a MSBuild Task

Today I need something really particular with NHibernate, I need to generate a “test” database schema from my MSBuild task in a particular Target. I know, there are simple options like use hbm2ddl (part of the NHibernate distribution) and this simple Mike Nichols’ MSBuild task but I want to use the hibernate configuration file.

This is my first attempt to do this in a MSBuild task, write this task in MSBuild was a very trivial code exercise, I need to improve it and get more things done, but right now I think is enough to get the job done.

The usage is very simple:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
    DefaultTargets="Test">
  <PropertyGroup>
     <NHibernateConfig>hibernate.cfg.xml</NHibernateConfig>
  </PropertyGroup>
  <ItemGroup>
    <TestDatabase Include="./test.db" />
  </ItemGroup>
  <UsingTask AssemblyFile="../bin/Rioshu.Msbuild.dll"
        TaskName="NHibernateSchema" />
  <Target Name="Test">
    <Delete Files="@(TestDatabase)"
        Condition="Exists('@(TestDatabase)')" />
    <NHibernateSchema ConfigurationFile="$(NHibernateConfig)"
        Export="true" />
  </Target>
</Project>

You can grab the bytes here: NhibernateSchemaMSBuildTask.zip

Testeando el HttpContext en ASP.NET MVC

MVP Awarded

mvp No sé porqué no lo había posteado antes, pero el día 1 de Julio recibí el siguiente mail en mi inbox:

Estimado/a Cristian Prieto,
Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2009. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de ASP/ASP.NET a lo largo del pasado año.

Claro, esa es la versión “genérica” de un mail diciéndote que este año has sido galardonado como MVP, así que todo indica que ahora soy MVP en ASP.NET. Gracias a cada uno de ustedes, los que día a día han tenido quesoportarme durante mis charlas, escuchar y aguantar mis quejas sobre que X ó Y no funciona como debería o sobre cómo debería hacerse el procedimiento X. Ahora más que nunca me dieron unas ganas increíbles de cooperar con la comunidad, ahora más que nunca creo que debemos instar más a la gente a mejorar con cada día, ahora más que nunca me siento en deseos de transformar a Morts en Elvis.

Gracias a todos, gracias amigos…

Cosas que uno aprende con Resharper

Una de las cosas que me encanta de Peer Programming es el concepto de shared knowledge, el aprender de tu compañero y que tu compañero posiblemente aprenda de ti (de lo que debe y no debe hacer). Uno de mis “amigos” en el escritorio es Resharper, un plugin de Visual Studio de Jetbrains (amo Jetbrains como empresa y definitivamente Resharper es un must have en mi toolbox).

Hoy aprendí dos cosas interesantes siguiendo las recomendaciones de Resharper al formatear mi código:

En inicializadores en línea de objetos en C#, si la propiedad se llama igual que el asignable, no es necesario nombrarla, por ejemplo

View("Subscribe", new {username = username, email = email});
// esto pasa a ser
View("Subscribe", new {username, email});

Otro dato interesante es que en inicializadores con constructores por defecto no es necesario ponerles los paréntesis, esa si era nueva para mi! (y me gusta más como queda):

var member01 = new Member() {Username = "test"};
// esto podría escribirse como
var member01 = new Member {Username = "test"};

Rayos, las cosas que uno aprende con R#!!!