2010-09-21 20 views
5

¿Cómo usar un solo componente para servicios múltiples en Unity Framework?Tipos reenviados en Microsoft Unity

En Windsor se configura de la siguiente manera:

var container = new WindsorContainer(); 
container.Register(Component.For<Service1, Service2>() 
          .ImplementedBy<Component>()); 

var service1 = container.Resolve<Service1>(); 
var service2 = container.Resolve<Service2>(); 

La idea con tipos reenviados es que si el componente es un producto único y service1service2son la misma instancia.

Respuesta

3

pasa esta prueba:

[Fact] 
public void ContainerCorrectlyForwards() 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<IService1, MyComponent>(
     new ContainerControlledLifetimeManager()); 
    container.RegisterType<IService2, MyComponent>(
     new ContainerControlledLifetimeManager()); 

    var service1 = container.Resolve<IService1>(); 
    var service2 = container.Resolve<IService2>(); 

    Assert.Same(service1, service2); 
} 
+0

¡Gracias! Pero, ¿sabía que pasará la prueba incluso si elimina ContainerControlledLifetimeManager() para IService1 o IService2? ¿Quién decidió que ContainerControlled anulará la vida útil transitoria (para los componentes con los mismos nombres, nombre predeterminado en nuestro caso)? –

+0

Eso es realmente sorprendente. No tengo una buena explicación para eso. De hecho, estaría tentado de registrarlo como un error ... –

+0

Con Unity 1.2 esa prueba falla sin ContainerControlledLifetimeManager – onof

0

yo sepa, no se puede: usted tiene que registrarse en cada servicio con el mismo componente asignada:

container.RegisterType<Service1, Component>(new ContainerControlledLifetimeManager()) 
     .RegisterType<Service2, Component>(new ContainerControlledLifetimeManager()) 
+0

wow, eso es bastante poco intuitivo –

+0

¿realmente hacer tipos reenviados? O registra dos componentes separados. Ver pregunta actualizada –

+0

Esta respuesta da como resultado dos instancias diferentes cuando resuelve Service1 y Service2 porque la duración predeterminada en Unity es Transitoria. –

Cuestiones relacionadas