image47dd1de4

Buenas,

hace unos días, Jorge escribió un artículo destripando el funcionamiento de un Singleton con .Net. Luego llegó José y también aportó un poco de luz al respecto; y yo me dije a mi mismo,

¿Pero estos de que hablan? programar un Singleton a mano, están locos o qué?

Vamos que desde el Edu definió a UNITY como “ese que hace los news” pues creo que no he creado un objeto con “new” desde hace bastante tiempo. Para los que no conocen UNITY, pues en pocas palabras es un inyector de dependencias creado por el equipo de Patterns & Practices de Microsoft que ya va por su versión 2.0 y que, como a la cerveza negra, te termina gustando cuando le agarras el gustito.

Veamos un ejemplo muy pero muy simple en el que utilizaremos una clase llamada “ClaseChorra” para validar las instancias que se creen de la misma.

El modelo de Singleton está basado en el ejemplo simple que explica Jorge en su post.

   1: class ClaseChorra

   2: {

   3:     private static ClaseChorra claseChorra;

   4:     public System.Guid Id { get; set; }

   5:     public ClaseChorra()

   6:     {

   7:         Id = System.Guid.NewGuid();

   8:     }

   9:     public override string ToString()

  10:     {

  11:         return Id.ToString();

  12:     }

  13:     public static ClaseChorra GetSingletonInstance()

  14:     {

  15:         return claseChorra ?? (claseChorra = new ClaseChorra());

  16:     }

  17: }

 

Antes de seguir >> DisclaimerHoy en España es Luernes (lunes + viernes) con lo que tampoco me estoy esforzando mucho con los ejemplos, es lo que suele suceder después de una semana ardua de trabajo.

No hace no falta que explique que si creo objetos a cholón, como explica Jorge en su post, pues tendré errores de lo más variado.
Por ejemplo el siguiente código me deja una única instancia con el mismo ID para cada ejecución de la misma:
 
   1: class Program

   2: {

   3:     static void Main(string[] args)

   4:     {

   5:         var c1 = ClaseChorra.GetSingletonInstance();

   6:         var c2 = ClaseChorra.GetSingletonInstance();

   7:         c2.Id = Guid.NewGuid();

   8:         Console.WriteLine("c1: {0}", c1);

   9:         Console.WriteLine("c2: {0}", c2);

  10:         Console.ReadLine();

  11:     }

  12: }

El resultado es:

   1: c1: 34baaf27-87de-42f7-b2ad-046e35ee65fa

   2: c2: 34baaf27-87de-42f7-b2ad-046e35ee65fa

 

Pues bien, hasta aquí el ejemplo de Jorge. Pero ¿cómo lo haríamos con UNITY?. Lo ideal es leer el artículo de MSDN “Using Lifetime Managers” donde se explican diferentes opciones para trabajar con el registro de tipos y de objetos en Unity. Yo dejaré un par de ejemplos.

Por ejemplo, en la siguiente porción de código, estoy definiendo un UnityContainer para que el mismo se encargue de crear por mí los objetos que yo necesito (recuerden las palabras del Edu > “UNITY es el que hace los news"). Utilizando el container creo las instancias c1 y c2 y luego muestro los valores de la misma.

   1: static void Main(string[] args)

   2: {

   3:     var myContainer = new UnityContainer();

   4:     myContainer.RegisterType<ClaseChorra>();

   5:     var c1 = myContainer.Resolve<ClaseChorra>();

   6:     var c2 = myContainer.Resolve<ClaseChorra>();

   7:     c2.Id = Guid.NewGuid();

   8:     Console.WriteLine("c1: {0}", c1);

   9:     Console.WriteLine("c2: {0}", c2);

  10:     Console.ReadLine();

  11: }

 

El resultado son 2 instancias diferentes de la misma clase:

   1: c1: dea932a8-7ce6-4f44-aa6c-89cb04bed186

   2: c2: 011f211a-9a83-463d-81ea-566ef0dbbdab

 

Ahora bien, si yo quisiese que siempre que se cree un objeto del tipo ClaseChorra, el mismo sea la misma instancia para todos, pues simplemente le digo a UnityContainer que tipo de LifeTimeManager debe utilizar. Existen varias opciones, pero para el siguiente ejemplo utilizaremos un PerThread, que nos ayuda a tener una única instancia del objeto por thread.

   1: static void Main(string[] args)

   2: {

   3:     var myContainer = new UnityContainer();

   4:     myContainer.RegisterType<ClaseChorra>(new PerThreadLifetimeManager());

   5:     var c1 = myContainer.Resolve<ClaseChorra>();

   6:     var c2 = myContainer.Resolve<ClaseChorra>();

   7:     c2.Id = Guid.NewGuid();

   8:     Console.WriteLine("c1: {0}", c1);

   9:     Console.WriteLine("c2: {0}", c2);

  10:     Console.ReadLine();

  11: }

 

Como bien estarás suponiendo, ahora las clases c1 y c2 son la misma:

   1: c1: 84b8087b-48f5-4519-9362-b5239603ac0a

   2: c2: 84b8087b-48f5-4519-9362-b5239603ac0a

 

Así que ya sabes, o te pones a codificar todo el patrón Singleton super-sure en tu código y dejas que “UNITY haga los news por tí” Risa

 

Saludos @ Home

El Bruno

   

Fuentes:

2 responses to “[UNITY] Trabajando con Singleton utilizando #UNITY”

  1. http://www.youtube.com/watch?v=iVed5u3mY-0&feature=related val la pena lo vean, es sobre Kinect con Unity3D

    Like

    1. Gracias renato 😀

      Like

Leave a reply to Renato Cancel reply

Discover more from El Bruno

Subscribe now to keep reading and get access to the full archive.

Continue reading