Wątek przeniesiony 2018-06-05 12:10 z Newbie przez Shalom.

Jak rozwiązywać wybór funkcjonalności w aplikacji

0

Przykład:
Przycisk i wyswietla prognoze pogodę, rownież robi jakieś tam oblicznia by ładnie pokazać prognoze pogody
Jest 3 dostarczycieli danych odnośnie pogody. Kazdy z nich ma SDK oraz każdy ma REST w którym można komunikować się bezpośrednio
Użytkownik, może sobie wybrać danego dostarczyciela danych

Problem:
Nie mam za bardzo pomysłu jak to rozwiązać by miało to ręce i nogi. Ustawienia w aplikacji, są w zupełnie innym miejscu niż ten przycisk (inna część kodu).
Przez to, ze użytkownik może wybrać daną opcje mój pierwszy pomysł z rozwiązywaniem zależności w IoC padł w gruzach i tu są moje pytania

  1. czy da się poprzez kontener IoC dynamicznie wybierać instancje w zależności od czegoś tam (w tym przypadku ustawienia)
  2. czy jest na to lepsze rozwiązanie niż ify i globalne zapamietanie stanu ustawien?
  3. czy lepiej używac SDK bo później jest tylko update SDK bez zmiany kodu (w teorii), ale za to jest mocna i dość duża zaleność, czy może wysyłać bezpośrednio na REST, ale wtedy ryzyko, ze zmienia API
1
  1. Niektóre kontenery mogą wstrzyknąć mapę ze wszystkimi implementacjami (np. Spring) i potem możesz sobie z tej mapy wyciągnąć po kluczu implementacje którą chcesz
  2. jw, mapa z której wyciągasz implemenacje na podstawie klucza z konfiguracji. Dzieki temu nie ma ifów i co więcej dodawanie nowych implementacji nie wymaga zmian w kodzie, o ile te opcje do wyboru w konfiguracji też są generowane automatycznie (tzn tam wstrzykujesz nazwy wszystkich implementacji)
  3. Trudno powiedzieć, nie ma jednej poprawnej odpowiedzi. Tak czy siak opakowałbym to osobnym modułem który wystawia twój własny interfejs, tak żeby tylko ten jeden moduł miał jakąkolwiek wiedzę o komunikacji z tym serwisem, a reszta twojego kodu polegała tylko na twoich interfejsach.
1

Pare dni temu pytałem się o podobną sprawę przy wykorzystanu Java/ Spring --> Jak wstrzykiwać różne implementacje interfejsu do jednego serwisu za pomocą Spring?

0

Sposobem bez dependency injection jest po prostu użycie factory pattern. Fabryka może np. brać obiekt/wartość konfiguracji i zwracać implementację. W sumie tutaj też można zastosować DI z tą różnicą że wstrzukiwana będzie fabryka/provider.

0

Wydaje mi się, że to powinno dać się jakoś rozwiązać Springowymi Beanami, chociaż nigdy tak nie robiłem.
Są adnotacje jak @Qualifier, tyle że statyczne.
Może można to samo robić jakoś dynamicznie w 2018, ewentaualnie dodać swoją adnotację, która wykorzystywała by jakąś zmienną i na jej podstawie określać którego beana zawołać.
Z drugiej strony dużo z tym kombinowania, pytanie czy warto...

1

W AutoFac wystarczyłoby zarejestrować wszystkich klientów poszczególnych SDKów, a potem lambdę wybierającą odpowiednią instancję na podstawie wartości z konfiguracji.

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