Wstrzykiwanie zależności (Dependency Injection) niezależnie od sposobu realizacji jest nieodłącznym elementem procesu budowania większości aplikacji. Wykorzystanie dostawcy zależności realizuje paradygmat Odwrócenia sterowania (Inversion of Control), który przenosi odpowiedzialność za inicjalizację niektórych obiektów na rzecz kontenera. Pozwala zmniejszyć ilość często powtarzającego się nadmiarowego kodu (boilerplate) dzięki czemu tworzony kod staje się krótszy, czytelniejszy, łatwiejszy w utrzymaniu i testowaniu. Koin jest biblioteką wstrzykiwania zależności o lekkiej strukturze przeznaczoną przede wszystkim dla programistów Kotlin. W przeciwieństwie do innych popularnych rozwiązań (np. Dagger) nie generuje dodatkowego kodu oraz nie wykorzystuje proxy czy refleksji, a pragmatyczne API sprawia, że jego użycie i konfiguracja jest łatwa i zwięzła.
Moduł
Konfiguracja i inicjalizacja obiektów dla kontenera zależności odbywa się w instancji modułu (module) dzięki czemu nie jest wymagane tworzenie osobnej klasy dla każdego modułu. Aby utworzyć moduł należy przypisać do zmiennej rezultat funkcji module w której zwracane są instancje danych typów - funkcje single dla pojedynczej instancji w obrębie zakresu i funkcja factory dla zwyczajnej instancji.
Rejestracja
Tworzenie i rejestracja komponentu kontenera KoinApplication zachodzi przy wywołaniu funkcji startKoin w której dokonuje się konfiguracji i przekazania referencji do modułów. Tworzenie kontenera może odbywać się w dowolnej klasie Android jednakże warto zarejestrować go w głównej klasie aplikacji dzięki czemu stanie się dostępny globalnie.
Wstrzykiwanie
Wstrzykiwanie zależności może zostać zrealizowane przez leniwą inicjalizację członków klasy przy pomocy funkcji inject lub poprzez bezpośrednie wstrzyknięcie do instancji funkcją get.
Zakres
Zakres pozwala na wykorzystanie wybranych zależności tylko w obrębie danej klasy, a jego tworzenie realizowane jest przy pomocy funkcji scope i oznaczania zależności definicją scoped. Wstrzyknięcie zależności odbywa się z poziomu obiektu ScopeInstance otrzymywanego z funkcji getActivityScope (getFragmentScope dla Fragment), którego należy powiązać z cyklem życia komponentu za pomocą bindScope.
ViewModel
Koin oferuje także integracje z klasą ViewModel co znacząco ułatwia pracę w przypadku realizacji aplikacji z wykorzystaniem mechanizmu data binding dla widoków. Aby dostarczyć obiekt typu ViewModel należy go oznaczyć w module jako viewModel oraz pobrać w miejscu docelowym za pomocą funkcji viewModel dla leniwej inicjalizacji lub bezpośrednio zainicjalizować funkcją getViewModel.
Testowanie
Wstrzykiwanie zależności może zostać także wykorzystywane w procesie testowania z JUnit dokładnie w taki sam sposób jak w klasach kodu źródłowego. Klasa testowa powinna rozszerzać KoinTest. Dodatkowo Koin umożliwia również tworzenie atrap (mock) obiektów dzięki czemu możliwa jest współpraca z bibliotekami naiwnych implementacji (np. Mockito).