2009-08-17 8 views
5

Czy jest możliwe, aby w Zamku Windsor Container jeden komponent implementował dwa różne interfejsy, a następnie, po rozwiązaniu, aby zwrócić to samo wystąpienie komponentu? Na przykład;Czy zamki windsor container zwrócą to samo wystąpienie komponentu implementującego 2 interfejsy?

var windsor = new WindsorContainer() 
    .AddComponent<InterfaceA, ClassAB>() 
    .AddComponent<InterfaceB, ClassAB>(); 

var classAB1 = windsor.Resolve<InterfaceA>(); 
var classAB2 = windsor.Resolve<InterfaceB>(); 

Assert.AreSame(classAB1, classAB2); 

Gdy próbuję to jak pokazano uzyskać wyjątek z komunikatem Jest składnikiem już zarejestrowana dla danego klucza, jeśli zapewniają różne klucze wówczas zwraca dwie oddzielne instancje klasy ClassAB.

Edytuj: Idealnie chciałbym to zrobić w pliku konfiguracyjnym.

+0

Pytanie dodany do Windsor FAQ: http://using.castleproject.org/display/IoC/FAQ –

Odpowiedz

11
[TestFixture] 
public class Forwarding { 
    public interface InterfaceA {} 

    public interface InterfaceB {} 

    public class ClassAB: InterfaceA, InterfaceB {} 

    [Test] 
    public void tt() { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<InterfaceA, InterfaceB>().ImplementedBy<ClassAB>()); 
     var a = container.Resolve<InterfaceA>(); 
     var b = container.Resolve<InterfaceB>(); 
     Assert.AreSame(a, b); 
    } 
} 
+0

Oh syn b ... naprawdę? Możesz to zrobić? Pan zna obejścia, które wymyśliłem. –

+0

Dzięki za odpowiedzi, wygląda to świetnie, ale po prostu przenieść posty celem wiesz, czy jest to możliwe do zrobienia w pliku konfiguracyjnym? – Gareth

+0

Tak, jest to możliwe. Zobacz http://stackoverflow.com/questions/274220 –

1

wiem jedno rozwiązanie tego - można to zrobić tak:

var someInstance = new Instance(); 
var container = new WindsorContainer(); 

container.Register(Component.For(typeof(IFirstInterface)).Instance(someInstance)); 
container.Register(Component.For(typeof(ISecondInterface)).Instance(someInstance)); 

... ale wtedy tracisz zdolność kontenera instancji klasy Instance, więc jego zależności nie zostanie automatycznie rozwiązana. Oczywiście, jeśli twoja instancja nie ma żadnych zależności, prawdopodobnie nie dbasz o to.