2013-10-04 10 views
5

Unity pozwala wymienić różne implementacje tego samego interfejsu, a następnie rozwiązać je według nazwy:Warunkowo rozwiązać nazwie wdrożenie w Jedności

var container = new UnityContainer(); 

// register 
container.Register<IFish, OneFish>("One"); 
container.Register<IFish, TwoFish>("Two"); 

// resolve 
var twoFish = container.Resolve("Two"); 

Załóżmy teraz mam klasy, który zależy od IFish i implementuje ITank:

class Tank : ITank 
{ 
    public Tank(IFish fish) {...} 
} 

Jak mogę rozwiązać problem z ITank i określić, którą implementację IFish uzyskać?

To nie działa:

container.Register<ITank, Tank>(); 

var tank = container.Resolve<ITank>("One"); 

to działa:

var fish = container.Resolve<IFish>("One"); 

var tank = container.Resolve<Tank>(new DependencyOverride(typeof(IFish), fish); 

ale obsługuje tylko proste przypadki (tak jak w tym przykładzie), nie ogólnym przypadku, gdzie może być wiele implementacje o nazwie "Jeden". Co chcę jest aby móc powiedzieć do jedności:

„Przy rozwiązywaniu implementacje używać nazwanych«One», jeśli nie taka realizacja jest rejestr spaść z powrotem do bezimiennego realizacji”

Czy istnieje zwyczaj rezolwer które można podłączyć do Unity przy takim zachowaniu?

+0

dostałeś odpowiedzi na zapytania tutaj? Mam do czynienia z podobnym problemem. – Nishith

+0

Przykro mi. W końcu mogę napisać rozszerzenie dla Unity, ale proste rozwiązanie, które opisałem, wystarcza teraz dla moich potrzeb. Zaktualizuję, jeśli to zrobię. –

Odpowiedz

3

Moglibyście InjectionFactory of Unity wstrzyknąć nazwaną instancję.

var container = new UnityContainer(); 

// register 
container.Register<IFish, OneFish>("One"); 
container.Register<IFish, TwoFish>("Two"); 

container.RegisterType<ITank,Tank>(new InjectionFactory(c=>c.Resolve<IFish>("One"))); 

Jeśli teraz rozwiążesz instancję typu Tank, instancja OneFish zostanie wstrzyknięta do Twojego czołgu.

Aby poradzić sobie sprawę, że chcesz, aby wprowadzić domyślną implementacja z IFish można zmienić InjectionFactory z następującym

new InjectionFactory(c=>{ 
    if (c.IsRegistered<IFish>("One")) { 
    c.Resolve<IFish>("One"); 
    } 
    else { 
    c.Resolve<IFish>("Two"); 
    } 
}) 
+0

Dziękuję za odpowiedź, ale nie chodzi o stosowanie ścisłej konfiguracji rejestracji. Pomyśl o systemie z kilkoma trybami, większość klas jest tworzona w ten sam sposób, ale kilka różni się między trybami: w trybie "produkcyjnym" dane są I/Oed z głównej bazy danych i błędy są rejestrowane, a "reklamy" hoc "tryb danych jest I/Oed z plików XML i nie następuje rejestracja. Chcę móc powiedzieć Jedności: rozwiązać "produkcję" lub rozwiązać problem "ad-hoc" jednocześnie w czasie wykonywania, a ja chcę udostępnić wspólną rejestrację. Mam nadzieję, że ktoś wie o istniejącej wtyczce Unity. –

+0

Myślałem, że to może być praktyczne rozwiązanie dla mnie, ale rzuca wyjątki próbujące rzucić IFish do ITank? – grinder22