Primeros avances del proyecto ASM

Saludos a todos.

Hace varios días que inicie el desarrollo del proyecto ASM – Agentes Salvavidas de Mascotas, he aquí los primeros avances del proyecto (v0.1.0) para que puedas tener una idea del estado actual. Ya sabes, si quieres ser parte de este proyecto y colaborar en cualquiera de las partes, puedes escribirme en Facebook o pasarme un mensaje directo en en Twitter @uialberto

estadoasm

Recordarte que el proyecto es totalmente #opensource y se encuentra alojado en GitHub, cuando desees puedes darte una vuelta y ver el estado actual de avance.

Una vez finalizado el desarrollo de todos los issues de la versión 0.1.0, prepararé un vídeo en mi canal de #Youtube o un hangouts para comentarte sobre los componentes usados y la experiencia del mismo.

Saludos

 

Extensiones Dev para Visual Studio

Saludos.

En esta oportunidad quiero compartirles las extensiones de Visual Studio que estoy usando en estos momentos, principalmente en el proyecto ASM – Agente Salvavidas de Mascotas.

Espero sea de su interés

01-github-extension-for-visual-studio

02-productivity-power-tools-2015

03 Web Essentials.png

04 Github Extension.png

05 File Nesting.png

06 Web Extension Pack 2015.png

Saludos

Proyecto Agente Salvavidas de Mascotas – ASM OpenSource

Hola a todos.

Como lo había comentado hace un par de semanas atrás en la página de Facebook. Quiero y deseo crear una aplicación web para gestionar el proceso de publicación y adopción de mascotas. Será un proyecto de código abierto y le he puesto por nombre «ASM – Agente Salvavidas de Mascotas». La idea principal es crear una comunidad de personas dispuestas a salvar y mejorar la calidad de vida de mascotas abandonadas en las calles o puestas en adopción, ofreciéndoles esta herramienta para facilitar y gestionar el proceso de encontrarles un hogar.

00001

¿Quieres ser parte del proyecto?

El proyecto estará escrito usando tecnología Microsoft .NET con C# 6.0 como lenguaje de programación, NET Framework 4.6.1, inicialmente con ASP.NET Web API como Framework de Servicios, etc.

He creado el repositorio en GitHub con la solución en blanco.

Características:

  • Gestionar Mascotas para Adopción
  • Gestionar Candidados de Adopción de Mascotas
  • Gestionar Estados de Publicación de Mascotas
  • Arquitectura del proyecto Domain Driven Design
  • Patrones de diseño Unidad de Trabajo, Repositorio, Inversión de Control e Inyección de Dependencias, Dtos, etc.
  • Autenticación Web API 2 OAuth Bearer Tokens
  • API REST bajo ASP.NET Web API 2
  • Entity Framework con Code First
  • Seguridad de Usuarios con ASP.NET Identity (Por definir)
  • Implementación de Pruebas Unitarias
  • Repositorio de Codigo GitHub

Como pueden ver, inicialmente el proyecto será creado como servicio usando ASP.NET Web API como Back-End. Espero que sea un proyecto de utilidad y sirva como base para futuros proyectos.

00002

En los próximos días estaré compartiendo y actualizando las primeras actividades a desarrollar en el proyecto en el Tablero de trabajo de GitHub

De igual manera, si encuentras errores en el proyecto, o tienes algunos comentarios / sugerencias puedes enviarlas al área de Issues de GitHub, o al correo: uialberto@outlook.com

Saludos y hasta pronto!

GitFlow o Flujo de Trabajo con Git y Visual Studio 2015

Saludos.

Quiero dedicar esta entrada para compartirles una de las estrategias y/o buenas practicas mas usadas por equipos de desarrollos de proyectos de Software durante la gestión de ramas en Git: GitFlow o Flujo de Trabajo con Git. Si bien existen muchas más, esta es una de las que mayor uso tiene.

GitFlow o Flujo de Trabajo con Git. Nos permite tener un estándar de desarrollo y organizar correctamente el desarrollo de un proyecto para tener una visión todo el tiempo del proceso y evolución del proyecto, para entender mejor:

gitflowui

  • Master: Es la rama (branch o trunk) principal que tiene la última versión productiva del código.
  • Release: Es la rama que contiene los nuevos features terminados que se van desarrollando para el siguiente lanzamiento (release) de forma que al iniciar uno nuevo puedas descargar todos los anteriores por si tienen alguna dependencia.
  • Develop: Es la rama que contiene las características (features) en desarrollo en una iteración, esta rama será posteriormente parte de Release mediante un pull request.
  • Feature: Es la rama que contiene el feature en el que estás trabajando personalmente (varios desarrolladores pueden trabajar en un feature), éste debe ser enviado a develop mediante un full request, por lo general aprobado por el líder técnico.
  • Hotfix: Es la rama que contiene cambios urgentes sobre master que permiten corregir un bug o resolver un error, éste debe ser enviado a master y se debe notificar a todos los desarrolladores para que puedan actualizar sus ramas.

Extension GitFlow for Visual Studio 2015

Esta extensión nos facilita el trabajo de realizar la gestión de ramas de manera automática aplicando la estrategia GitFlow. Una vez creado el repositorio Git e instalado la extension podemos ver como podemos iniciar la creacion de las distintas ramas, y una vez terminado el trabajo finalizar la misma.

1-11-2016-9-19-45-p-m

Iniciar Feature, Release, Hotfix.

1-11-2016-9-24-49-p-m

Que sea de utilidad durante el desarrollo de sus proyectos y la gestión de ramas.

Hasta pronto.

Herramienta TFS Power Tools 2015

Saludos.

Si en estos momentos te encuentres desarrollando proyectos usando los sistemas control de versiones como Team Foundation Server o Visual Studio Team Services, más si tu plantilla de control de versiones es Team Foundation Version Control, entonces eres feliz por que existe TFS Power Tools. Esta herramienta nos permite visualizar tanto desde el shell explorer de windows como de visual studio ciertas opciones de TFS; items de trabajo, plantillas de procesos, archivos modificados, archivos nuevos, cambios pendientes, etc.

27-9-2016-12-17-18-a-m

Desde su página oficial puedes ver las distintas versiones soportadas para los diferentes IDE´s de Visual Studio y TFS, desde VS 2010 hasta la última version VS 2015, además de las características que tiene con integración de Power Shell.

Muchas veces cuando descargamos un proyecto desde TFS nos encontramos que al dirigirnos a la carpeta de proyecto (explorador de archivos), no visualizamos los iconos como corresponde en el Visual Studio, respecto a los cambios pendientes, eliminación o adición de un nuevo archivo, para resolver ésto debemos realizar unos pequeños cambios en el registro de windows (regedit.exe).

Considerando que tienes instalado la version de TFS Power Tools en tu equipo, realizamos lo siguiente:

Abrir regedit.exe y dirigirnos a:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers

Observamos que existen varias carpetas con el prefijo Tfs…

27-9-2016-12-36-26-a-m

Lo que hacemos es cambiar el nombre y añadirle unos 3 espacios al inicio del nombre, con ello logramos que las carpetas ocupen las primeras posiciones de la carpeta ShellIconOverlayIdentifiers. lo que hace es  que tengan prioridad respecto a los demás.

Abrimos la carpeta del proyecto y .. genial!! Tenemos los iconos en el explorador de Windows.

27-9-2016-12-46-42-a-m

Espero les sea de utilidad, no olvides como desarrollador es importante tener el control del proyecto desde los mas mínimos detalles, y que el día a día sea lo más eficiente posible.

Saludos.

Contenedor de Inversión de Control – Unity 3.0 para ASP.NET MVC

Saludos.

Continuamos con los contenedores de inversión de control, en esta oportunidad nos vamos a centrar en Unity.mvc, el contenedor oficial de Microsoft creado por el equipo Patterns & Practices para proyectos ASP.NET MVC.

Instalación

Para instalar el componente usamos Nuget, ya sea desde la interfaz gráfica o la consola de instalación.

 PM> Install-Package Unity.mvc

Una vez finalizada la instalación del paquete podemos ver que se han creado un par de archivos en la carpeta App_Start: UnityConfig.cs y UnityMvcActivator.cs. En el primero de ellos encontramos la configuración de contenedor, el punto en el que registraremos nuestras clases e interfaces para posteriormente usarlas en la resolución de dependencias. En UnityMvcActivator.cs, se encuentra el código de inicialización específico de la integración para ASP.NET MVC, usando el componente WebActivatorEx, una útil herramienta que permite introducir módulos de forma dinámica, durante el arranque.

Registro de componentes

El registro de interfaces y clases se lo realiza sobre el contenedor Unity. Para ello, nos dirigimos al archivo UnityConfig.cs e implementarlo de la misma forma que siempre:

public static void RegisterTypes(IUnityContainer container)
{
 // container.LoadConfiguration();
 
 // TODO: Registrar los tipos aqui
 
 container.RegisterType<IUnitOfWork, UnitOfWork>(new TransientLifetimeManager(), 
 new InjectionConstructor(connectionString.ConnectionString));

 // container.RegisterType<IUsuariosRepository, UsuariosRepository>();
 // container.RegisterType<IMascotasRepository, MascotasRepository>();
 
 container.RegisterType<IUsuariosAppServices, UsuariosAppServices>(new ContainerControlledLifetimeManager());
 container.RegisterType<IMascotasAppServices, MascotasAppServices>("SingletonMascota", new ContainerControlledLifetimeManager());
 container.RegisterType<FuenteDigital>(new ContainerControlledLifetimeManager(), 
 new InjectionProperty("Id", objeto.Id), new InjectionProperty("Name", objeto.Name));

}

Así podemos ir registrando cuantos pares interfaz-clase necesitemos en la aplicación.

Instancias Per request

Una de las características importanes en Unity 3.0 y su integración con MVC es la gestión del ciclo de vida de las instancias per request. Los que antes se tenia que pensar en vincular las instancias a un contenedor padre usando HierarchicalLifetimeManagers o sobrescribir manualmente el método Dispose() para que éste fuera liberado una vez termine la petición, ahora podemos ir al grano registrando los componentes y/o clases de forma PerRequestLifetimeManager, con esto hacemos que las instancias sean únicas por cada request o petición, ahorrando recursos y/o memoria.

public static void RegisterTypes(IUnityContainer container)
{
 // container.LoadConfiguration();
  container.RegisterType<IUsuariosRepository, UsuariosRepository>(new 
   PerRequestLifetimeManager());
  container.RegisterType<IMascotasRepository, MascotasRepository>(new 
   PerRequestLifetimeManager());
}

Para que esto sea posible y las instancias sean liberadas correctamente al finalizar la petición, en el archivo UnityMvcActivator.cs que Nuget ha dejado en la carpeta App_Start:

public static void Start() 
{
 var container = UnityConfig.GetConfiguredContainer();
 //....
 //....

 // TODO: Uncomment if you want to use PerRequestLifetimeManager
 // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility
 // .RegisterModule(typeof(UnityPerRequestHttpModule));
}

Simplemente descomentamos la llamada a RegisterModule() del final y las instancias serán liberadas al finalizar la petición de forma automática, lo que antes lo hacíamos con los Dispose(), ahora Unity nos ahorra el trabajo de hacerlo automáticamente.

Convenciones

Otras de las características importantes que tiene Unity 3.0 son las convenciones, el poder registrar los componentes basándonos en convenciones es mucha dosis, nos ahora bastante trabajo a la hora de hacer el mantenimiento. Para lograr ésto, debemos decirle a Unity que debe usar la convención de nombrado para interfaces y clases con nombres equivalentes, aquí un ejemplo:

public static void RegisterTypes(IUnityContainer container)
{
 container.RegisterTypes(
 AllClasses.FromAssemblies(typeof(MvcApplication).Assembly),
 WithMappings.FromMatchingInterface,
 WithName.Default, 
 WithLifetime.Custom<PerRequestLifetimeManager>
 );
}

Con ésto ya no tendremos que asociar mil interfaces del tipo IMyComponent a la clase MyComponent. Por supuesto, estas convenciones son configurable y puedes conocer mas en el sitio oficial de Unity.

Espero esta publicación te sirva como una introducción al contenedor Unity, sin duda puedes encontrar ejemplos avanzado en la pagina oficial, lo importante es que vayas conociendo algunas herramientas que facilitan el proceso y gestión del ciclo de vida de los componentes.

Saludos.

Contenedor de Inversión de Control – IoC Container

En esta oportunidad quiero compartirles sobre los contenedores de inversión de control (IoC Containers). Uno de los puntos a tomar en cuenta durante el desarrollo de sistemas es reducir el acoplamiento entre componentes, mientras mas bajo sea éste, menos esfuerzo realizamos durante el proceso de integración de los mismos, además estar preparados ante cualquier cambio que puedan surgir.  Uno de los principios SOLID que nos ayudan para lograr este objetivo es el Principio de Inversión de Dependencia y las técnicas de Inyección de Dependencias, acompañados con los magníficos contenedores de inversión de control.

Un Contenedor de Inversión de Control (IoC Container) es un componente especializado en la creación de instancias de objetos, así como en la gestión del ciclo de vida éstas, en términos simples es una clase encargada de suministrarnos las instancias que necesitemos en nuestra aplicación y olvidar sus dependencias hacia otras clases. ¡Fabuloso!. Nos olvidamos de los molestos «new» cada vez que necesitemos una instancia de alguna clase, por supuesto requiere una configuración inicial donde registramos todas las clases.

Los contenedores de inversión de control se apoyan en dos conceptos muy importantes Inyección de Dependencia e Inversión de Control, muchos creen que son lo mismo pero son dos conceptos diferentes que comparten cosas en común.

Inyección de Dependencia (DI)

  • Es un patrón de diseño que consiste en hacer que nuestras piezas de Software sean independientes.
  • Se refiere a la forma de como implementar el patrón IoC.
  • Se refiere a la forma de como los objetos consumidores reciben sus dependencias

Inversión de Control (IoC)

  • Patrón de diseño que coadyuva al bajo acoplamiento entre componentes de un sistema o una aplicación.
  • Los objetos consumidores no crean los objectos ayudantes, de los que depende. Estos son creados por un contenedor (Ejem: Unity Conteiner), que inyectará las dependencias. Útil para implementar un sistema enfocado a un diseño orientado a componentes.

Ahora vamos a ver uno de los contenedores mas usados dentro de la plataforma .NET, si aún no lo conoces es momento de hacerlo e iniciar el desarrollo de tus proyectos usando esta herramienta.

Unity (By Microsoft)

Éste IoC Container fue creado por Microsoft Pattern & Practices.

unity

Unity tiene licencia MS-PL Licence. Fue escrito por Chris Tavares y su “Kernel” está basado en ObjectBuilder.

Aquí puedes ver como puedes iniciar la configuración del contenedor y registrar las clases.

public class Bootstrapper
{
private IUnityContainer unityContainer;
public Bootstrapper()
{
unityContainer = new UnityContainer();
unityContainer.RegisterType<IPasswordCipher, Pbkdf2PasswordCipher>(new ContainerControlledLifetimeManager());
unityContainer.RegisterType<IPasswordCipherFactory, Pbkdf2PasswordCipherFactory>(new ContainerControlledLifetimeManager());
var cipherPassword = unityContainer.Resolve<IPasswordCipher>();
var cipherPasswordFactory = unityContainer.Resolve<IPasswordCipherFactory>();
// Usamos los objetos instanciados
var cifrado = cipherPassword.Encryp("password");
}
}

Si bien este es un ejemplo sencillo, mas adelante estaré compartiendo las distintas configuraciones que puedes realizar, inyectar constructor y la configuración de los tiempos de vidas de los objetos.

Espero sea de utilidad y puedas aplicarlos en tus proyectos.

Saludos y hasta pronto.

Versionamiento Semántico – SemVer

Hola a todos. Aquí estamos nuevamente.

Quiero compartir con ustedes un artículo que nos ayudará a comprender y aclarar algunas dudas acerca del versionamiento de Software. Hoy en día es común encontrarnos con herramientas de gestión de dependencias, en .NET tenemos Nuget, y en Java, Maven. Ambas herramientas nos facilitan la gestión de dependencias en nuestros sistemas. Sin embargo, ¿Te has preguntado alguna vez que significan esos números [1.2.1] que aparecen cada vez que instalas un paquete en Nuget?, pues bien si no lo sabias, es momento de comprender su significado.

Ver Artículo Versionamiento Semántico

semver

 

Recuerda que uno de los requisitos para subir tu paquete en Nuget es el versionado del paquete, y recomiendan cumpla con  esta especificación.

Que sea de utilidad.

Saludos.

Presentacion Tips Team Foundation Server

Les comparto otras de las presentaciones a los interesados en una introducción sobre  Tips de Team Foundation Server, un servicio de gestión del ciclo de vida proyectos de SW, con el que podrás realizar no sólo el control de versión de tu aplicación, sino también el seguimiento de tareas realizadas y por hacer, asignacion de tareas entre los miembros de un equipo de desarrollo, etc.

Si estas interesado en una presentación del contenido del curso, puedes escribirme a: uialberto@outlook.com

Saludos.

 

Presentación Curso Entity Framework Basic

 

 

Saludos.

A los interesados en capacitaciones o cursos de actualización, aquí les comparto la presentación del Curso Entity Framework Basic.

Si estas interesado en una presentación del contenido del curso, puedes escribirme a: uialberto@outlook.com

 

Saludos.