2010-03-02 12 views
35
public interface IInterface1 
{ 
} 

public interface IInterface2 
{ 
} 

public class MyClass : IInterface1, IInterface2 
{ 
} 

... 

ObjectFactory.Initialize(x => 
{ 
    x.For<IInterface1>().Singleton().Use<MyClass>(); 
    x.For<IInterface2>().Singleton().Use<MyClass>(); 
}); 

var x = ObjectFactory.GetInstance<IInterface1>(); 
var y = ObjectFactory.GetInstance<IInterface2>(); 

Otrzymuję dwie różne instancje MyClass z powyższym kodem. Jak mogę go zdobyć?Wykorzystanie singletonu StructureMap (klasa klasy implementująca dwa interfejsy)

Odpowiedz

51

Można użyć Forward <,>() rejestracja powiedzieć StructureMap rozwiązać typ Wykorzystując rozdzielczość innego typu. Powinno to zrobić to, czego oczekujesz:

ObjectFactory.Initialize(x => 
{ 
    x.For<IInterface1>().Singleton().Use<MyClass>(); 
    x.Forward<IInterface1, IInterface2>(); 
}); 
+0

aaaawesome. dokładnie to, czego szukałem. Dziękuję Ci – GR7

-4

An ObjectFactory jest przeznaczonych do tworzenia wielu wystąpień. Jeśli chcesz singleton, napisz klasę singleton (być może z publicznymi właściwościami IInterface1 i IInterface2 jako akcesorami).

Wydaje się być szkicowo udokumentowane, ale może można zamiast tego użyć Container.

+9

Kontener (ObjectFactory lub ręcznie utworzony kontener) może obsłużyć cykl życia obiektu - nie trzeba samemu wdrażać zachowania singleton. –

1

Spróbuj spojrzeć na różne przeciążenia do użycia, szczególnie przeciążenie Func. Stamtąd możesz powiedzieć, w jaki sposób StructureMap powinien utworzyć twoją instancję z innym zarejestrowanym już obiektem.

12

Chciałbym zarejestrować samą MyClass, a następnie wyciągnąć to z kontekstu dla instrukcji użycia poszczególnych interfejsów.

ForSingletonOf<MyClass>().Use<MyClass>(); 

For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>()); 
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>()); 
+1

To właśnie dla mnie zadziałało! Metoda "x.Forward" nie zadziałała, mój kod nie mógł rozwiązać IInterface2. – andyhammar

+3

@andyhammer Być może zamieniłeś dwa interfejsy. FROM jest pierwszy, TO jest drugi. Zrobiłem ten błąd ... Fajne rozwiązanie, myślałem, że mam zły projekt i nie było możliwe, ale myślę, że inne mają ten sam problem, dzięki Bogu. – Syska

+0

Myślę, że to podejście jest czystsze, nie lubię łączyć ze sobą tych interfejsów. –

Powiązane problemy