MKOl w czasie kompilacji

11

Czy ktoś rozpoczął projekt wykonywania MKOl w czasie kompilacji (być może przy użyciu emitowanego Roslyn lub Linq MethodInfo)?

Moje doświadczenie z kontenerami MKOl było jak dotąd świetne, z wyjątkiem kilku drobnych problemów

  1. Uruchamianie wielu kontenerów MKOl jest powolne, ponieważ występuje tutaj duża część logiki rozdzielczości
  2. Często trudno jest zapewnić rozdzielczość, ponieważ kompilacja nie zapewnia już możliwości wywołania konstruktora
  3. Często pojemniki IOC dodają niewielki narzut do środowiska wykonawczego (niektóre nie są nawet małe, często te, które uruchamiają się szybko, działają wolno)

Wydaje mi się, że idealnym rozwiązaniem byłoby dodanie kroku kompilacji do łańcucha kompilacji, który dodaje klasę Factory zamiast IOC.

Czy ktoś już to zrobił? Jeśli nie, dlaczego nie?

ArTs
źródło

Odpowiedzi:

4

Robienie tego nie powinno być takim problemem. Po prostu uruchom tę samą logikę IoC i zamiast tworzenia instancji klas, emitujesz kod, który wykonuje instancję.

Ale robiąc to, usuwasz jedną wielką zaletę IoC: Możliwość zmiany sposobu komponowania komponentów bez konieczności ponownej kompilacji całej aplikacji. Wystarczy zastąpić konfigurację, aby aplikacja mogła korzystać z różnych usług lub źródeł danych. I chociaż nie widziałem jeszcze aplikacji, która w pełni skorzystałaby z tej możliwości, wciąż jest to znacząca część sukcesu IoC.

Euforyk
źródło
Tak, wiem, że to możliwe. Ale jeszcze nie widziałem kontenera IoC, który to robi. Zauważyłem również, że obecna tendencja wydaje się dotyczyć rejestracji w kodzie (płynne interfejsy API). Biorąc to pod uwagę, rozważam napisanie wspomnianego kontenera IoC.
ArTs
Wydaje mi się, że pamiętam, że Hiro ( github.com/philiplaureano/Hiro ) mógł robić swoje rzeczy w czasie kompilacji.
lzcd
2
„Ale robiąc to, usuwasz jedną wielką zaletę IoC: możliwość zmiany sposobu komponowania komponentów bez konieczności ponownej kompilacji całej aplikacji”. Wydaje mi się, że zastosowanie tego do całej aplikacji jest przesadą; zamieniasz każdą część aplikacji w wtyczkę. Dodatkowo obie techniki powinny być w stanie współistnieć - nie ma powodu, dla którego nie można połączyć niektórych komponentów w czasie kompilacji, a niektóre w czasie wykonywania.
Doval
Nie rozumiem, jak to ogromna zaleta. W jakim kontekście całkowicie wymieniasz komponenty w czasie wykonywania? Może kilka przypadków użycia konfiguracji?
andyczerwonka
4

Robi to Dagger dla Java / Android . Poświęca trochę magii środowiska wykonawczego (np. Guice'a), aby zaoferować prawie całkowicie kompilację czasu kodowania, w tym konwersję większości błędów środowiska wykonawczego na błędy kompilacji.

Byłoby też fajnie w .NET.

orip
źródło