Kontener DI i wiele implementacji interfejsu

0

Czytałem dzis trochę o kontenerze DI i tak się zastanawiam co zrobić jak mamy wiele implementacji interfejsu które sa uzywane w aplikacji. Np w artykule był przyklad ze jest interfejs IEmailSender do wysyłania maili. Nie było konkretnych przykladów tylko taki z grubsza poruszenie tematu.

Zastanawiam sie teraz co mam zrobic jak bede chcial zaimplementowac kilka wersji tego interfejsu, np (nie czepiajmy sie zasadności istnienia poniższych implementacji, bardziej chodzi mi o możliwość kontenera) chce dac uzytkownikowi wybor i bede mial klasy:

  • GMailEmailSender,
  • WPEmailSender,
  • InteriaEmailSender
  • itp.

Na podstawie jakis opcji wybranych przez usera chciałbym uzyc jednej z tych implementacji. Co wtedy mam zrobic z kontenerem skoro tam moge zarejestrowac tylko jedna implementacje dla mojego interfejsu IEmailSender?

0

We wszystkich znanych mi kontenerach można zarejestrować dowolną liczbę implementacji danego interfejsu.
Potem można na przykład po name tagu je wstrzykiwać lub wstrzyknąć całą kolekcję implementacji.

Zgaduje, że potrzebujesz po prostu w klasie obsługującej to żądanie użytkownika otrzymać całą listę implementacji i tam dopiero sobie znaleźć odpowiednią.

1

Najlepiej nie używaj kontenerea DI. W szczególności do takich rzeczy.

0

Ja robie tak (Spring) że biore sobie sobie kolekcje implementacji danego interfejsu i z tego robie mape. Przykład:
Masz aplikacje która liczby ile kierowca zapłaci opłaty za postój. Masz zwykłego kierowcę i VIPa. Wstrzykujesz liste takiego kalkulatora i robisz mape z tego <DriverType, PaymentCalculator>. Masz w trakcie działa aplikacji podany typ kierowcy i wtedy wybierasz implementacje. Zreszta to podejście jest całkiem dobre (w odpowiednich przypadkach oczywiście) niezaleznie czy masz kontener czy po prostu DI przez konstruktor i pozwala na realizacje Open-Closed Principle.

0

Co wtedy mam zrobic z kontenerem skoro tam moge zarejestrowac tylko jedna implementacje dla mojego interfejsu IEmailSender?

A kto cię tak okłamał? o_O Oczywiście że możesz więcej. Ba, Spring to nawet pozwala ci wstrzyknąć List<IEmailSender> i wstrzyknie wtedy wszystkie, albo Map<String, IEmailSender> i wstrzyknie ci mapę nazwa -> obiekt dla wszystkich pasujacych beanów.

0

@scibi92: @Shalom wiecie może czy w Ninject lub Autofac jest to podobnie?
Czyli spokojnie moge sobie używać strategi i kontenery powinny mi to obslyzyc?

0

Ninject jest z C kratki więc troche nie moja bajka ale tutaj jest jakas sensowna odpowiedż: https://github.com/ninject/Ninject/wiki/Multi-injection

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0