2012-12-26 24 views
8

Czasami znajduję się w sytuacji, w której muszę rozwiązać usługę tylko wtedy, gdy spełniony jest określony warunek. Na przykład użytkownik może wybrać wysłanie wiadomości e-mail lub powiadomienia sms. Chciałbym leniwego załadować usługę e-mail lub sms w zależności od tego, co wybierze użytkownik, aby nie musieć ładować ich obu i marnotrawić zasobów (co gdyby na przykład było 10 opcji dla użytkownika ...?).Usługi leniwe ładowanie Castle Windsor

Problem mam tylko z użyciem pojemnika poza moim bootstrap kodu (nie chcę mojego kodu zależy od th pojemniku). Nie mogę znaleźć sposobu na używanie kontenera dla leniwych usług ładujących (chyba że tworzę potrzebne usługi ręcznie i wykonuję wszystkie DI ręcznie). Czy jest to sytuacja, w której reguły mogą być zgięte lub czy istnieje lepszy sposób na to?

Odpowiedz

5

Jeśli używasz Windsor Castle 3.0 lub nowszy, można użyć leniwy rozwiązywania.

Zobacz What's new in Windsor 3 for more details.

Proces rejestracji zmienia nieco (nowa ładowarka składnik musi być zarejestrowany).

Po tym czasie rejestrujesz komponenty tak jak zawsze, ale rozwiązują zależności jako Lazy<T> zamiast T. Dopóki nie uzyskasz dostępu do właściwości , Twoja zależność nie zostanie rozwiązana, więc możesz przekazać kilka leniwie ocenionych obiektów i uzyskać dostęp tylko do tego, którego będziesz potrzebować i kiedy będziesz potrzebować.

Jeśli masz więcej opcji do użytkownika, może należy rozważyć utworzenie jakiegoś abstrakcyjnego interfejsu fabrycznego. Następnie rejestrujesz i rozwiązujesz tylko tę fabrykę, a sama fabryka utworzy odpowiednią usługę do wysyłania powiadomień (czy to poczta, sms czy jakakolwiek inna opcja). Wdrożenie fabryki może być kodowane ręcznie lub Castle Windsor możesz z tym (myślę, że od wersji 3.0).

Często kiedy używam takiej fabryki, wdrażam ją ręcznie i przekazuję kontener, ponieważ jest to zależność, więc tylko wykonanie fabryki zależy od mojego kontenera.

1

Ogólnie, można to zrobić z Typed Factory Facility.

W skrócie, jeśli rozwiązać komponent, który korzysta z tych usług, zamiast dać mu usługę e-mail lub sms, dajesz mu fabrykę że można je (Create, który jest zdefiniowany przez użytkownika, bez odniesienia do kontener)

Obiekt zajmie się "wdrożeniem" twojej fabryki (z interfejsu, który utworzysz), więc jest bardzo mało do zrobienia.

+0

Co jeśli każda z moich usług ma swój unikalny zestaw zależności. Na przykład usługa sms ma 3 unikalne zależności, usługa e-mail ma 4 unikalne zależności, itd. Czy po prostu wstrzyknęłabym do fabryki 20 (lub jakkolwiek wiele) zależności? Wielka reakcja btw. – orourkedd

+0

Fabryka jest realizowana przez zamek. Po prostu skonfiguruj swoje usługi w zwykły sposób. –

2

Wystarczy przykład w celu uproszczenia (na podstawie Marcin Deptuła odpowiedzi)

// activate Lazy initialization feature for all Components 
.Register(Component.For<ILazyComponentLoader>().ImplementedBy<LazyOfTComponentLoader>())  
// register rest of component(s) 
.Register(Component.For<IIssueRepository>().ImplementedBy<IssueRepository>()) 
. .... 

resolve leniwie (wtrysk nieruchomość)

public Lazy<IIssueRepository> IssueRepository { get; set; } 
IssueRepository.Value.GetLastIssue(); 

resolve normalny (wtrysk nieruchomość)

public IIssueRepository IssueRepository { get; set; } 
IssueRepository.GetLastIssue(); 
Powiązane problemy