martes, 27 de enero de 2015

VMware-Windows: No images are available

En un pc con windows 7, VMware versión gratuita me dispongo a crear una máquina virtual con Windows Server 2012. Al crear la máquina con la opción de crearla a partir de la ISO del sistema operativo a media instalación me sale esta pantalla con el mensaje No images are avaible:

areaTIC:VMware-Windows: No images are avaiable

Para solucionarlo y poder seguir con la instalación voy al menú de VMware, Player -> Manage -> Virtual Machine Settings (Ctrl + D). Una vez en la configuración, en la pestaña General sitúate sobre la opción "Floppy Disk" y en la sección connection selecciona la opción "Auto Detect".

areaTIC:VMware-Windows: No images are avaiable floppy solution

Si vuelves a arrancar la máquina debería dejarte seguir con la instalación.

Espero te sea de utilidad, recuerda que puedes seguir areaTIC si lo deseas en las principales redes sociales y todo comentario, aportación o corrección es bien recibida! Que vaya bien.

sábado, 17 de enero de 2015

Asp.Net WebApi: IOC, IdependencyResolver, N Tiers

A partir de la versión 2 del producto asp.net web api incorpora IdependyResolver. Esta interfaz nos permite realizar una implementación personalizada de un DependencyResolver y asignarlo a la configuración de la API.

Esto facilita usar un contenedor IOC en este tipo de proyectos implementando un dependency resolver. Hasta ahora los fabricantes de IOC tenían que proporcionar algun tipo de sistema para que el contenedor persistiese en el ciclo de vida de la aplicación web y se integrase en el pipeline de las peticiones para así poder inyectar los tipos necesarios al instanciar controladores.

Ahora podríamos implementar nuestro DependencyResolver usando un IOC container de terceros y asignarlo a la configuración de la api, de este modo es el mismo framework web api el que se encarga de gestionar la inyección de dependencia con ayuda del resolver.

Os paso un articulo donde está explicado como implementar la inyección de dependencia en controladores en una web api con unity. Aquí usan UnityResolver que puedes descargar de nuget.

Asp.net -> Dependency Injection

Este sistema, por defecto, propone registrar las dependencias de modo programático. Has de tener en cuenta que si la web api es la punta del iceberg de una arquitectura N Tier con varios niveles como una DDD podrías llegar a tener alguna limitación con este sistema que se plantea.

En una arquitectura de este tipo la api tendrá acceso a una capa de negocio y la capa de negocio tendrá acceso a una capa de datos.



Desde la api no tendrás acceso a la capa de datos, o no deberías!!. Si la configuración de las dependencias se está llevando desde el archivo webapiconfig.cs, allí necesitarás registrar el tipo explícitamente en el contenedor IOC (...) ¿Qué pasa si quieres registrar un tipo en el contenedor que pertenece a la capa de datos? Mírate este artículo, propone hacerlo con MEF y explica los pasos para hacerlo. Lo tengo implementado y funciona OK.

Developer.com -> Depedency Injenction Best Practices in an N Tier modular Application

En resumen, con este sistema que se plantea tendrías la configuración organizada de este modo:

WebApiConfig.cs -> public static void Register(HttpConfiguration config)
   //IOC
    var container = new UnityContainer();
    ModuleLoader.LoadContainer(container, ".\\bin", "areaTIC.*.dll");
    container.RegisterType<IGenericFacade<User>, GenericFacade<User>>();
    config.DependencyResolver = new UnityResolver(container);
ModuleInit.cs -> (tenemos un ModuleInit en cada nivel, aquí business)
    [Export(typeof(IModule))]
    public class ModuleInit : IModule
    {
        public void Initialize(IModuleRegisterType iocContainer)
        {
            //register types here.
            iocContainer.RegisterType<IGenericRepository<User>, GenericRepository<User>>();
        }
    }
En este ejemplo he usado Unity pero podrías usar otros, te paso una serie de artículos interesantes a modo de comparativa que podrían ayudarte en un momento determinado a escoger fabricante de IOC:

ElegantCode -> Comparativa IOC
Curah -> Unity Vs other IOC Containers

Espero os resulte útil el post, cualquier debate, apreciación, duda y demás ya sabes que puedes hacérnosla llegar a través de comentarios o redes sociales. Hasta la próxima!

viernes, 9 de enero de 2015

Asp.Net WebApi: Route con parámetros opcionales

Buenas, el articulo de hoy es cortito, conciso y posiblemente un poco trivial para quien esté acostumbrado a trabajar con webapi. Se explica como definir parámetros opcionales en una acción de un controlador tipo ApiController y como enrutarlos.

Imagina que necesitas enrutar esta acción:
[ResponseType(typeof (IEnumerable<UserFriendDTO>))]
public IHttpActionResult Get(int userId, bool? pending)
En primer lugar comentar que por defecto el template de proyecto WebApi que ofrece .net ya te enruta el Get con un parámetro Id (...) sin necesidad de definir ninguna ruta adicional. En este caso no me interesa filtrar un Get de UserFriend por Id del recurso sino que me interesa filtrar por UserId que es un atributo del recurso UserFriend y además me gustaría en algunas ocasiones decirle que sólo me devuelva las solicitudes pendientes de un usuario concreto...

En segundo lugar comentar que es un ejemplo poco RestFul, tal vez en este caso sería más correcto renombrar el recurso UserFriend a Friend y hacer algo así como Users/4/Friends?... pero bueno no lío más la cosa como ejemplo para el tema de opcionales en la acción ya valdría.

Tal y como tenemos esta acción nunca resolvería esta llamada, recibirás un Not Found.
api/UserFriend/4?pending=true
Veamos cual sería el modo correcto de hacerlo:
[ResponseType(typeof (IEnumerable<UserFriendDTO>))]
[Route("api/UserFriend/{userId}")]
public IHttpActionResult Get(int userId, bool? pending = null)
Esta acción queda asociada de este modo a estas 2 rutas:
api/UserFriend/4?pending=true
api/UserFriend/4
Ahora puedo decirle que me devuelva todas las solicitudes de un usuario concreto (sin pasar ningún valor en pending), que me devuelva sólo las pendientes (pending = true) o que me devuelva sólo las que están resueltas (pending = false).

Es importante que los parámetros opcionales los marquemos como nullable y además le asignemos un valor por defecto en la misma firma de la acción como veis en el segundo ejemplo.

Hasta aquí el primer articulo del año, recordar que podéis seguir areaTIC en las redes sociales y vuestros comentarios, criticas, correcciones o insultos (jajjaja) son bienvenidos.

Hasta la próxima!