2010-04-23 8 views
25

Tenemos un escenario donde el usuario puede elegir entre diferentes hardware en tiempo de ejecución. En el fondo tenemos varias clases de hardware diferentes que implementan una interfaz IHardware. Nos gustaría utilizar Unity para registrar la instancia de hardware actualmente seleccionada para esta interfaz. Sin embargo, cuando el usuario selecciona otro hardware, esto requerirá que reemplacemos este registro en tiempo de ejecución.Unidad: Reemplace el tipo registrado con otro tipo en tiempo de ejecución

el siguiente ejemplo se podría hacer esto más claro:

public interface IHardware 
{ 
    // some methods... 
} 

public class HardwareA : IHardware 
{ 
    // ... 
} 

public class HardwareB : IHardware 
{ 
    // ... 
} 


container.RegisterInstance<IHardware>(new HardwareA()); 

// user selects new hardware somewhere in the configuration... 

// the following is invalid code, but can it be achieved another way? 
container.ReplaceInstance<IHardware>(new HardwareB()); 

¿Se puede lograr este comportamiento de alguna manera?

BTW: Estoy completamente al tanto de que las instancias que ya se han resuelto del contenedor no se reemplazarán con las nuevas instancias, por supuesto. Nos ocuparíamos de eso nosotros mismos forzándolos a resolver la instancia una vez más.

Respuesta

37

El método RegisterInstance de UnityContainer siempre anulará la última entrada de registro si no los distingue por su nombre.

Así que si usted llama

container.RegisterInstance<IHardware>(new HardwareB()); 

va a anular el registro de la interfaz IHardware y retreive HardwareB en el siguiente intento resolver

+0

Eso está bien, no sabía/que tratar. ¡Muchas gracias! – gehho

Cuestiones relacionadas