2013-05-28 14 views
9

W kodzie bootstrapującym StructureMap używam niestandardowej konwencji do skanowania złożeń i dodawania par interfejsów/implementacji do wykresu obiektów jako nazwane instancje. Zasadniczo mam jakąś logikę, która sprawdza ustawienia konfiguracyjne i ćwiczenia do tego oświadczenia w zależności od różnych warunków:Nazwane wystąpienia i wystąpienie domyślne w strukturze?

registry.For(interfaceType).Use(type) 
    .Named(implementationName); 

to dodaje wszystkich wymienionych przypadkach dobrze. Jednak chciałbym również dodać instancję domyślną w przypadku, gdy nazwa instancji nie jest określona. Jednak domyślna instancja nie zawsze jest ostatnią dodaną do wykresu. Czasami inne nazwane instancje są dodawane później podczas skanowania. Wydaje się jednak, że niezależnie od tego, która instancja zostanie dodana jako ostatnia, niezależnie od tego, czy jest ona nazwana, jest zawsze domyślna.

Próbowałem różnych kombinacji płynnego API, w tym:

registry.For(interfaceType).Add(type); 

czyli

registry.For(interfaceType).Use(type); 

Nawet niektóre z tych oznaczonych jako przestarzałe. Ale wynikowe zachowanie jest zawsze takie, że ostatnie jest domyślne. Więc jeśli kolejność dodawania wdrożeń jest coś takiego:

  1. W przypadku interfejsu Logger używać realizację log4net nazwie „log4net”
  2. W przypadku interfejsu Logger używać realizację log4net domyślnie
  3. W przypadku interfejsu Logger użyj implementacji Mock o nazwie "Mock"

Wynikające z tego zachowanie polega na tym, że implementacja "makiety" jest używana jako domyślna, gdy nie podano żadnej nazwy. Debugowanie w AllInstances w pojemniku, widzę w następującej kolejności:

  1. Instancja rejestratorze log4net nazwie „log4net”
  2. Instancja rejestratorze log4net z GUID o nazwie (jak każdy inny Domyślnie instancji, o ile mogę powiedzieć)
  3. instancją Mock rejestratora o nazwie „Mock” ​​

debugowanie w oświadczeniu rejestrowania przy nazwie z pojemnika bez nazwy instancji, jednak wyniki w Mock realizacji używane.

Czy istnieje sposób dodania domyślnej instancji do wykresu obiektu, gdy nadal można dodawać nazwane instancje?

Odpowiedz

20

Metoda będzie dodawać instancje (jeśli chcesz dodać nazwane instancje lub dodać wiele instancji do użycia z kolekcjami/wyliczeniami). Jeśli nie zarejestrowano jawnej wartości domyślnej (przy użyciu metody Use), ostatnią instancją dodaną będzie domyślna instancja. Metoda Use służy do ustawiania domyślnej instancji. Jeśli wielokrotnie powołasz się na Use, ostatnia zarejestrowana instancja stanie się domyślna.

Aby ustawić wystąpienie domyślne, a następnie zarejestrować się dalej nazwanych wystąpień powinien być w stanie zrobić to tak:

registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net"); 
registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock"); 

To sprawi, że instancja Log4Net domyślny, a także dostępny jako wystąpienie nazwane. Instancja Mock będzie dostępna jako nazwana instancja.

Powiązane problemy