Jestem przyzwyczajony do IoC/DI w aplikacjach internetowych - głównie Ninject z MVC3. Mój kontroler jest stworzony dla mnie, wypełniony wszystkimi zależnościami w miejscu, podległościami itp.Właściwy sposób wykonywania iniekcji Dependency w aplikacji klienta Windows (WPF)
Rzeczy są jednak różne w grubej aplikacji klienckiej. Muszę tworzyć własne obiekty lub muszę powrócić do podejścia opartego na stylu lokalizatora usług, w którym pytam jądro (prawdopodobnie za pomocą jakiegoś interfejsu, aby umożliwić testowalność), aby dać mi obiekt kompletny z zależnościami.
Widziałem jednak kilka miejsc, w których Lokalizator Usług został opisany jako wzorzec przeciwwskazania.
Moje pytanie brzmi - czy jeśli chcę korzystać z aplikacji Ninject w mojej grubej aplikacji klienckiej, czy istnieje lepszy/bardziej odpowiedni sposób na uzyskanie tego wszystkiego?
- Testability
- Właściwa DI/IoC
- najmniejszą ilością sprzęgła możliwym
Należy pamiętać, że nie jestem tylko mówić o MVVM tutaj i coraz Przeglądanie modeli w widokach. Jest to w szczególności spowodowane koniecznością dostarczenia obiektu typu repozytorium z jądra, a następnie pobierania elementów z tego repozytorium z wprowadzoną funkcjonalnością (dane oczywiście pochodzą z bazy danych, ale również potrzebują niektórych obiektów jako parametrów w zależności od stanu świata, a Ninject wie, jak to zapewnić). Czy mogę w jakiś sposób to zrobić bez pozostawienia obu repozytoriów i podmiotów jako niepoprawnych mes?
Jeśli coś jest niejasne, daj mi znać. Dzięki!
EDIT 14 lipca
Jestem pewien, że te dwie odpowiedzi przewidziane są prawdopodobnie poprawne. Jednak każde włókno mojego ciała walczy z tą zmianą; Część z nich jest prawdopodobnie spowodowana brakiem wiedzy, ale jest też jeden konkretny powód, dla którego mam problem z dostrzeganiem elegancji tego sposobu robienia rzeczy;
Nie wyjaśniłem tego wystarczająco dobrze w pierwotnym pytaniu, ale chodzi o to, że piszę bibliotekę, która będzie używana przez kilka (4-5 początkowo, może później) aplikacji klienckich WPF. Wszystkie te aplikacje działają na tym samym modelu domenowym itd., Więc przechowywanie wszystkiego w jednej bibliotece jest jedynym sposobem na utrzymanie DRY. Istnieje jednak szansa, że klienci tego systemu będą pisać własnych klientów - i chcę, aby mieli prostą, czystą bibliotekę do rozmowy. Nie chcę zmusić ich do użycia DI w ich składzie głównym (używając terminu jak Mark Seeman w jego książce) - ponieważ to HUGELY komplikuje rzeczy w porównaniu do nich właśnie wymyślanie MyCrazySystemAdapter() i używanie tego.
Teraz, MyCrazySystemAdapter (nazwa wybrana, ponieważ wiem, że ludzie nie zgadzają się ze mną tutaj) musi być skomponowany przez podskładniki i złożony razem przy użyciu DI. Sam MyCrazySystemAdapter nie powinien być wstrzykiwany. Jest to jedyny interfejs, z którego klienci muszą rozmawiać z systemem. Tak więc klient szczęśliwie powinien dostać jeden z nich, DI dzieje się jak magia za kulisami, a obiekt składa się z wielu różnych obiektów przy użyciu najlepszych praktyk i zasad.
Rozumiem, że będzie to kontrowersyjny sposób na zrobienie czegoś. Jednak znam także ludzi, którzy będą klientami tego API.Jeśli zobaczą, że muszą uczyć się i podłączać system DI, i tworzyć z wyprzedzeniem swoją całą strukturę obiektów w punkcie wejścia do aplikacji (Composition Root), zamiast tworzyć nowy obiekt, dadzą mi środkowy palec i Zanieczyszczaj bazy danych bezpośrednio i zepsuj rzeczy tak, jak trudno sobie wyobrazić.
TL; DR: Dostarczenie odpowiednio zorganizowanego interfejsu API jest zbyt trudne dla klienta. Moje API musi dostarczyć pojedynczy obiekt - zbudowany za kulisami przy użyciu DI i odpowiednich praktyk - z których mogą korzystać. Prawdziwy świat czasami trąca pragnienie budowania wszystkiego wstecz, aby pozostać wiernym wzorcom i praktykom.
-1 Twoje 'GetStuff()' jest lokalizatorem usług w sukience. Nie rób tego. (Nie ma nic złego w reszcie twojej odpowiedzi, ale SLness sprawia, że to nie w porządku) –
Ruben, masz rację. Poprawiłem moją odpowiedź! –
Jeszcze zanim ujrzałem odpowiedź Remo'a (co uważam za poprawne podejście), miałem zamiar zasugerować wstrzyknięcie fabryk (jako Funcs gdzie to odpowiednie a la http://stackoverflow.com/questions/4840157/does-ninject-support- func-auto-generated-factory/4851885 # 4851885) –