2011-01-06 15 views
26

¿Puede alguien explicarme la noción de contenedor Unity como si fuera un niño de 6 años? ¿Cómo funciona y qué hace?WPF/Prism: ¿Qué es un contenedor UNITY?

+2

no es tanto que no es un contenedor Unidad, pero la 'unidad' es el nombre de un contenedor en particular la inyección de dependencias (DI). Prism también viene con MEF y es compatible con cualquier otro contenedor DI. La unidad fue lo primero. Si desea leer sobre la diferencia entre Unity y MEF, lea la sección correspondiente en http://msdn.microsoft.com/en-us/library/ff921140(v=PandP.40).aspx. – Pat

+0

@Pat, MEF es un marco de plug-in mientras que Unity es un verdadero contenedor DI. –

Respuesta

47

Esta es una descripción más técnica del fondo, espero que todavía la encuentre útil.

En general, es un contenedor DI (inyección de dependencia).

Dada la siguiente clase:

public class Sample 
{ 
    Service a; 

    public Sample() 
    { 
    a = new Service(); 
    } 
} 

El problema con esto es que se inicializa su propia versión de Service, por lo que es muy difícil de ajustar los cambios de código (es decir, si usted quiere intercambiar Service con algo. diferente). También dificulta las pruebas.

Para resolver esto, en realidad no crear por sí mismo, pero conseguirlo desde el exterior:

public class Sample 
{ 
    Service a; 

    public Sample(Service aService) 
    { 
    a = aService; 
    } 
} 

Ahora que ha tomado la creación fuera de la clase sólo puede ponerlo allí desde el exterior , aumentando la capacidad de prueba y mantenimiento. Sin embargo, todavía tiene una dependencia en la clase Service. No está realmente interesado en esa clase específica, sino en el comportamiento que ofrece, por lo que crea una interfaz fuera de ella.

public class Sample 
{ 
    IService a; 

    public Sample(IService aService) 
    { 
    a = aService; 
    } 
} 

Ahora puede reemplazar el servicio con lo que desee. Por ejemplo, tiene una clase que obtiene datos de un servidor que usa un servicio. Ahora, desea probar solo el análisis de datos y no el servicio de búsqueda de datos, simplemente cree una clase que implemente la interfaz, sirviendo datos estáticos, ¡listo!

Ahora, Unity entra en juego. En este momento, debe resolver las dependencias usted mismo. Lo que hace la unidad es simple - que toma todas las clases que tienen dependendencies y resuelve los - lo que sólo puede llamar al (pseudocódigo, no sé unidad):

UnityContainer uc = new UnityContainer(); 
var a = uc.GetService<IService>(); 

Y le consigue la clase fácilmente utilizable.

¿Qué hemos logrado con eso?

  • el código es más fácil de mantener, ya que no se basan en tipos específicos
  • el código es más comprobable
  • la aplicación es fácilmente ampliable

A modo de resumen: ayuda a la creación de un mejor aplicaciones más rápido.

+1

¿El servicio se instancia cuando se agrega al contenedor o cuando se llama al método GetService? Si solicita el mismo servicio en dos lugares diferentes, pero desde la misma instancia de Unity, ¿obtendrá el mismo objeto o instancias separadas? –

+1

Lo siento, no puedo decírtelo, nunca antes había usado Unity. Generalmente hablado, depende de la implementación del contenedor/framework. Echa un vistazo a la documentación, debería haber una descripción de esto. Además, algunos contenedores le ofrecen la posibilidad de definir un contrato de por vida, por lo que puede tener instancias únicas (siempre obtener el mismo) o nuevas instancias para cada solicitud. Como dije antes, depende completamente del contenedor. – Femaref

+0

Ok He leído partes del manual de Unity y esto parece muy configurable, así que supongo que puedes hacerlo como quieras. –

33

Unity Container es como un tarro lleno de cookies, cuando necesitas una cookie, solo pides jar para darte una cookie.

cada galleta es tener algunas virtudes, como se puede comer una galleta pero no se puede comer, porque es muy difícil comer (algo así como Singleton)

cuando tu madre crea una nueva cookie, que acaba de poner esa galleta en el frasco en lugar de darte directamente!

+16

que parece el tipo de respuesta de un niño de 6 años. :) –

+0

yup;), OP pregunta de esa manera! – TalentTuner

+3

En esta analogía, ¿quién interpreta el papel de la madre? – atiyar

7

recomiendo que usted pueda ver Mike Taulty's Prism video series

Los dos primeros capítulos responderá a su pregunta, y se puede ver el resto de capítulos para aprender Prisma (aunque su versión 2 y bastante viejo, los principios básicos siguen siendo los mismos .. .)

Buena suerte :)