2010-04-23 14 views
25

Mamy scenariusz, w którym użytkownik może wybierać między różnymi urządzeniami w czasie wykonywania. W tle mamy kilka różnych klas sprzętowych, które implementują interfejs IHardware. Chcielibyśmy użyć Unity, aby zarejestrować aktualnie wybraną instancję sprzętową dla tego interfejsu. Jednak gdy użytkownik wybierze inny sprzęt, wymagałoby to zastąpienia tej rejestracji w środowisku wykonawczym.Unity: Zastąp zarejestrowany typ innym typem w środowisku wykonawczym

Poniższy przykład może zrobić to jaśniej:

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()); 

Czy takie zachowanie można osiągnąć jakiś sposób?

BTW: Jestem całkowicie świadomy, że instancje, które zostały już usunięte z kontenera, nie zostaną oczywiście zastąpione nowymi instancjami. Zadbamy o to sami, zmuszając ich do ponownego rozpatrzenia instancji.

Odpowiedz

37

Metoda RegisterInstance UnityContainer zawsze będzie nadpisywać ostatnią pozycję rejestracji, jeśli nie rozróżni się ich nazwy.

Więc jeśli zadzwonisz

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

można przesłonić rejestrację dla interfejsu IHardware i retreive HardwareB na następnej próbie rozdzielającym

+0

to jest fajne, nie wiem/spróbować. Wielkie dzięki! – gehho

Powiązane problemy