Mi enfoque para el desarrollo ágil es construir "cortes verticales". Tomo una historia de la interfaz de usuario para el almacenamiento y la implemento. Tengo algunas herramientas livianas que utilizo para ayudar a este proceso (como un marco IRepository / UnitOfWork simple que tiene adaptadores para In Memory (generalmente para pruebas), Entity Framework y NHibernate. En este momento no creo que haya mucho de un argumento de si uno debe usar un O / RM, sino cuál usar, y para mí depende del entorno.
He descubierto que este enfoque se gana a los detractores con respecto al desarrollo ágil porque pueden ver el software en funcionamiento más rápidamente que si paso mucho tiempo por adelantado creando un núcleo. En combinación con el diseño impulsado por dominio y algunas otras técnicas que utilizo, generalmente puedo obtener mucha funcionalidad de trabajo frente a los usuarios muy rápidamente.
La prueba TDD o incluso la prueba de unidad post-hoc es importante porque parte del mantenimiento de la velocidad a medida que su aplicación crece es tener esa red de seguridad que proporciona un conjunto completo de pruebas unitarias. "Necesito hacer un cambio en esta clase, ¿cómo me aseguro de no romper nada?" Con un buen conjunto de pruebas unitarias, es tan simple como ejecutar ese conjunto de pruebas. Sin esto, se trata de ejecutar manualmente la aplicación para verificarla. No es divertido en absoluto.