{"id":373743,"date":"2024-05-21T05:43:14","date_gmt":"2024-05-21T05:43:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=373743"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=373743","title":{"rendered":"<span>Kodein DI \u0434\u043b\u044f Android. \u0426\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 DI<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b26\/1b9\/6ce\/b261b96ce411cdf6905eb65b486ffc58.png\" width=\"1797\" height=\"1025\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b26\/1b9\/6ce\/b261b96ce411cdf6905eb65b486ffc58.png\"\/><\/figure>\n<p>DI \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u043e\u0432: \u0442\u0435, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u044f\u0442 \u0441\u0432\u043e\u0439 \u0433\u0440\u0430\u0444 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (compile time \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438), \u0438 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 (runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438).<\/p>\n<p><a href=\"https:\/\/github.com\/kosi-libs\/Kodein\">Kodein<\/a> \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435: \u0432\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u0435\u0439\u0441, \u0438 \u0443 \u0432\u0430\u0441 \u043a\u0440\u0430\u0448 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0438\u0437-\u0437\u0430 DI! \u042d\u0442\u043e \u0436\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043a\u043e\u0448\u043c\u0430\u0440!<\/p>\n<p>\u041d\u043e \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 Kodein \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432? \u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u043c\u0438? \u0415\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442! \u041c\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u043d\u0430\u0448 DI \u0438\u0437 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 runtime \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u0440\u0430\u0437\u0440\u044f\u0434 deploy time \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.<\/p>\n<p>\u042d\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u0440\u043e Kodein DI \u0434\u043b\u044f Android:<\/p>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 1:\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/755288\/\">Kodein DI \u0434\u043b\u044f Android. \u041e\u0441\u043d\u043e\u0432\u044b API<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 2: <a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/766058\/?code=1c99a063f9a3a1550d12e4baef9421b5&amp;state=lVkmrZhVrYCJLYi4fv5EfZco&amp;hl=ru\">Kodein DI \u0434\u043b\u044f Android. KMP \u0438 Compose<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 3: Kodein DI \u0434\u043b\u044f Android. \u0426\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 DI<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0433\u043d\u0430\u043b\u0438.<\/p>\n<h3>DI \u0433\u0440\u0430\u0444<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c DI \u0433\u0440\u0430\u0444\u0430. \u041f\u043e\u0434 DI \u0433\u0440\u0430\u0444\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u0425\u043e\u0442\u044f \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u0444\u0430, \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 \u043e\u0434\u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u0444, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u2014 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0447\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439). \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445 \u00ab\u0433\u0440\u0430\u0444\u00bb \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u0430\u044f, \u0430 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u0432\u044f\u0437\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0433\u0440\u0430\u0444.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u0427\u0442\u043e \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 DI? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u0430\u0444\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>\u2014 \u0423\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0413\u0440\u0430\u0444, \u0434\u0430\u0439 \u043c\u043d\u0435 \u043a\u043b\u0430\u0441\u0441 A!<\/p>\n<p>\u2014 \u0423\u043f\u0441, \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f A \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0430\u0441\u0441 B, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043c\u0435\u043d\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u043e\u0445\u043e\u0436\u0435, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c\u044e ?<\/p>\n<h3>\u0426\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0432 Kodein<\/h3>\n<p>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 Kodein. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439  \u043c\u043e\u0434\u0443\u043b\u044c:<\/p>\n<pre><code class=\"kotlin\">fun moduleOfAuth() = DI.Module(\"authModule\") { bind&lt;PhoneEndpoint>() with singleton {    instance&lt;Retrofit>().create(PhoneEndpoint::class.java)  }  bind&lt;PhoneDataSource>() with singleton {   PhoneDataSourceImpl(        phoneEndpoint = instance(),        mapper = instance(),   ) } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>PhoneDataSourceImpl<\/code> \u043d\u0443\u0436\u0435\u043d <code>mapper<\/code>, \u043d\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 &#171;authModule&#187; <code>mapper<\/code> \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d. \u0415\u0441\u043b\u0438 <code>mapper<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0433\u0440\u0430\u0444 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c, \u0438\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435, \u0442\u043e \u043d\u0430\u0448 \u0433\u0440\u0430\u0444 \u0431\u0443\u0434\u0435\u0442 <strong>\u043d\u0435\u0446\u0435\u043b\u043e\u0441\u0442\u043d\u044b\u043c<\/strong>, \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>PhoneDataSourceImpl<\/code> Kodein \u043a\u0438\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f \u0434\u0430\u043b\u0435\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 <em>Injection<\/em>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>Retrieval<\/em> (aka Service Locator).<\/p>\n<blockquote>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443, \u0430\u0432\u0442\u043e\u0440\u044b Kodein <a href=\"https:\/\/kosi-libs.org\/kodein\/7.21\/core\/injection-retrieval.html#_injection_retrieval\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0441 \u0447\u0435\u043c \u044f \u043d\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d, \u0438 \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">class MyRepositoryImpl(di: DIAware) : MyRepository, DIAware by di {    ...   private val endpoint by instance&lt;Endpoint>()   ... }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f, \u043c\u044b, \u0447\u0438\u0442\u0430\u044f \u043a\u043e\u0434, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0435\u0433\u043e \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0422\u043e \u0437\u0434\u0435\u0441\u044c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u043e <code>by instance()<\/code>, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0415\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 <code>Endpoint<\/code>, \u0433\u0434\u0435 \u0435\u0433\u043e \u0438\u0441\u043a\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u0438 \u0442.\u0434.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 <em>Injection<\/em>, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0435\u0440\u044f\u0435\u043c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u2014 \u043c\u043e\u0434\u0443\u043b\u0435\u043c. \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0442\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043c\u043e\u0434\u0443\u043b\u0435. \u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <em>Retrieval<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0412 Kodein DI \u0433\u0440\u0430\u0444 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 runtime&#8217;\u0435, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 runtime&#8217;\u0435. \u042d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043e\u0437\u0434\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (<em>Injection<\/em>), \u043c\u044b \u0445\u043e\u0442\u044c \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044f\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u0433\u0440\u0430\u0444\u0430 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440). \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>Retrieval<\/em> \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u043e \u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0418 <em>Injection,<\/em> \u0438 <em>Retrieval<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043d\u0435 \u0434\u0430\u044e\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432 runtime&#8217;\u0435.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0420\u0435\u0448\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043a\u0443<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e Kodein \u2014 \u044d\u0442\u043e runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, \u0438 \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0432 compile time \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u0443 \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439? \u0410 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0437\u0436\u0435 compile time \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 runtime? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014 deploy time! \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430\u0448 DI \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0441 deploy time \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 CI.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 CI? \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<ul>\n<li>\n<p>Unit-\u0442\u0435\u0441\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>UI-\u0442\u0435\u0441\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, UI-\u0442\u0435\u0441\u0442\u044b \u0440\u0435\u0448\u0430\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041d\u043e UI-\u0442\u0435\u0441\u0442\u044b \u2014 \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u0440\u043e\u0433\u043e. \u0410 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0451\u0448\u0435\u0432\u043e \u0438 \u0431\u044b\u0441\u0442\u0440\u043e. \u0417\u043d\u0430\u0447\u0438\u0442 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c Unit-\u0442\u0435\u0441\u0442\u044b!<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0435\u0440\u044b Kodein \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u0430\u0436\u043e\u0440\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438). \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043c\u043e\u0433\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c \u0438 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<p>\u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f 2 \u0448\u0430\u0433\u0430:<\/p>\n<ol>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e <em>Injection<\/em> \u043f\u043e\u0434\u0445\u043e\u0434. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (<em>Retrieval<\/em>) \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0448\u0435\u043c Unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430!<\/p>\n<\/li>\n<\/ol>\n<h3>\u0428\u0430\u0433 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e Injection \u043f\u043e\u0434\u0445\u043e\u0434<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439. \u0412\u043e\u0442 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c:<\/p>\n<pre><code class=\"kotlin\">class RepositoryImpl(di: DIAware) : Repository, DIAware by di {   ...   private val datasource by instance&lt;DataSource>()   private val mapper by instance&lt;Mapper>()   ...<\/code><\/pre>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">class RepositoryImpl(   private val datasource: DataSource,   private val mapper: Mapper, ) : Repository {  \/\/ Module bind&lt;Repository>() with singleton {   RepositoryImpl(     datasource = instance(),     mapper = instance(),   ) }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u0431\u044b\u043b \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0430\u0433, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443!<\/p>\n<h3>\u0428\u0430\u0433 2. Unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 DI<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0430\u0448\u0438\u0445 DI \u0433\u0440\u0430\u0444\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><strong>AppDI<\/strong>. \u042d\u0442\u043e \u0433\u0440\u0430\u0444 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Dagger 2 \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 AppComponent. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e singleton \u0441\u043a\u043e\u0443\u043f \u0438 \u0442\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0431\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>ContextDI<\/strong>. \u042d\u0442\u043e \u0433\u0440\u0430\u0444 \u0441 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u0422.\u0435. \u044d\u0442\u043e \u0433\u0440\u0430\u0444 \u0433\u0440\u0443\u043f\u043f\u044b \u0444\u0438\u0447 \u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d\u0431\u043e\u0440\u0434\u0438\u043d\u0433, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>FeatureDI<\/strong>. \u042d\u0442\u043e \u0433\u0440\u0430\u0444 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0444\u0438\u0447\u0438, \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1d\/030\/a67\/f1d030a67ef04fbab4595386307eb65c.png\" width=\"1538\" height=\"742\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f1d\/030\/a67\/f1d030a67ef04fbab4595386307eb65c.png\"\/><\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u044d\u0442\u0438 3 DI \u0433\u0440\u0430\u0444\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c-\u0440\u0435\u0431\u0451\u043d\u043e\u043a. \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 Kodein. \u041e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u044b <code>subDI<\/code>, \u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c <code>SubComponent<\/code> \u0432 Dagger 2.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 <strong>\u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430.<\/strong> \u0418 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0442\u0432\u0435\u0442 (\u0442\u043e, \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043d\u0430\u0448 DI \u0442\u0435\u0441\u0442):<\/p>\n<pre><code class=\"kotlin\">  @Test   fun `SubDI of ProductFragment has integrity`() = diTest {     assertDIHasIntegrity(diSUT)   }<\/code><\/pre>\n<p>\u041f\u043e\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<ul>\n<li>\n<p>\u042f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e <code>assertDIHasIntegrity<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u0443\u043f-\u043c\u0435\u0442\u043e\u0434 <code>diTest<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430 \u0441\u0445\u0435\u043c\u043a\u0435<\/h3>\n<p>\u041a\u0430\u043a \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0433\u0440\u0430\u0444 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u2014 \u0435\u0441\u0442\u044c 3 \u043c\u043e\u0434\u0443\u043b\u044f \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0421\u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e, \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f47\/cbd\/57f\/f47cbd57fef57b5e599a3f4d687df2ce.png\" width=\"2064\" height=\"882\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f47\/cbd\/57f\/f47cbd57fef57b5e599a3f4d687df2ce.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0433\u0440\u0430\u0444\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0432\u0441\u0435\u0433\u043e \u043b\u0438 \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb8\/853\/a34\/bb8853a34f6f7d6b5ff7f941951b82d3.gif\" width=\"2054\" height=\"896\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb8\/853\/a34\/bb8853a34f6f7d6b5ff7f941951b82d3.gif\"\/><\/figure>\n<p>\u041d\u0430 \u0433\u0438\u0444\u043a\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u043b\u044f <code>a1<\/code>, <code>a2<\/code>, <code>b1<\/code> \u2014 \u0432\u0441\u0435\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0410 \u0432\u043e\u0442 \u0434\u043b\u044f <code>c1<\/code> \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <code>d1<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 \u00ab\u0432\u043d\u0435\u0448\u043d\u0438\u0439\u00bb \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0448 DI \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c (<code>subDI<\/code>) \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 DI.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c59\/995\/e7d\/c59995e7df805eb63de4ac6dea7f212c.png\" width=\"2060\" height=\"1066\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c59\/995\/e7d\/c59995e7df805eb63de4ac6dea7f212c.png\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u0432\u0441\u0451 \u043e\u043a \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0415\u0441\u043b\u0438 \u0438\u0445 \u0442\u0430\u043c \u043d\u0435\u0442, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430.<\/p>\n<h3>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <code>Presenter<\/code> \u0444\u0430\u0431\u0440\u0438\u043a\u0430 <code>provider<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u043c <code>PresenterImp<\/code> \u0441 \u0442\u0440\u0451\u043c\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>instance()<\/code>.<\/p>\n<pre><code class=\"kotlin\">bind&lt;Presenter>() with provider {     PresenterImpl(         mapper = instance(),         voFactory = instance(),         interactor = instance(),     ) }<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f <code>Presenter<\/code>, \u0433\u0434\u0435-\u0442\u043e \u0432 \u0433\u0440\u0430\u0444\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <code>mapper<\/code>, <code>voFactory<\/code> \u0438 <code>interactor<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u00ab\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c\u00bb \u0432\u044b\u0437\u043e\u0432\u044b <code>instance()<\/code> \u0438 \u0443\u0437\u043d\u0430\u0442\u044c, \u0441 \u043a\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u044b. \u0415\u0441\u043b\u0438 \u043c\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u043d\u0443\u0436\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <code>PresenterImpl<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>DirectDIBase<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <code>Instance<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442.<\/p>\n<pre><code class=\"kotlin\">public interface DirectDIBase : DirectDIAware {   ...   public fun &lt;T : Any> Instance(type: TypeToken&lt;T>, tag: Any? = null): T   ... }<\/code><\/pre>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>DirectDIBase<\/code> \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 <code>DirectDIBaseImpl<\/code>, \u0433\u0434\u0435, \u043a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043c\u0435\u0442\u043e\u0434 <code>Instance<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043c\u0435\u0442\u043e\u0434 <code>provider<\/code>.<\/p>\n<pre><code class=\"kotlin\">internal abstract class DirectDIBaseImpl: DirectDI {     override fun &lt;T : Any> Instance(type: TypeToken&lt;T>, tag: Any?): T {         return container.provider(             key = DI.Key(                 contextType = context.anyType,                 argType = TypeToken.Unit,                 type = type,                 tag = tag,             ),             context = context.value         ).invoke()     } }<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e <code>DirectDIWrapper<\/code>. \u0418 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043c 2 \u0432\u0435\u0449\u0438:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>Instance<\/code> \u043c\u044b \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043b\u0431\u0435\u043a <code>instanceCallback<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043d\u0430\u0440\u0443\u0436\u0443, \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e-\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 mock. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u0430 \u043e\u043d \u043d\u0430\u043c \u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">class DirectDIWrapper(   private val _directDI: DirectDI,   private val instanceCallback: (TypeToken&lt;*>) -> Unit, ) : DirectDI by _directDI {   ...   override fun &lt;A, T : Any> Instance(     argType: TypeToken&lt;in A>,     type: TypeToken&lt;T>,     tag: Any?,     arg: A,   ): T {     instanceCallback(type)     val myClass: Class&lt;T> = Class.forName(type.qualifiedDispString()) as Class&lt;T>     return mock(myClass)   } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>assertDIHasIntegrity<\/code>. \u041f\u043e \u0441\u0443\u0442\u0438 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0432\u0435\u0449\u044c: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0433\u0440\u0430\u0444\u0435 (\u0432 Kodein \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f bindings) \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u0440\u044f\u043c\u043e \u043a\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 \u0433\u0438\u0444\u043a\u0435 \u0432\u044b\u0448\u0435. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">fun DITestContext.assertDIHasIntegrity(di: DI) {   di.container.tree.bindings.forEach {     assertContainsDependenciesFor(di, it.key.type, it.key.tag, it.key.argType)   } }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>assertContainsDependenciesFor<\/code>.<\/p>\n<p><strong>\u0428\u0430\u0433 1 \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430<\/strong>. \u0412 Kodein \u043a\u043b\u044e\u0447 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u2014 \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0442\u0438\u043f \u0438 \u0442\u044d\u0433. \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445, \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0438\u0445 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 Kodein \u2014 \u0442\u0430\u043c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<pre><code class=\"kotlin\">  \/\/ 1   val key = Key(       contextType = TypeToken.Any,       argType = argType,       type = type,       tag = tag,   ) <\/code><\/pre>\n<p><strong>\u0428\u0430\u0433 2 \u2014 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e <\/strong><code>DirectDIWrapper<\/code> <strong>\u043a\u043b\u0430\u0441\u0441\u0430<\/strong>. \u041c\u044b \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043b\u044f\u043c\u0431\u0434\u0443. \u0412 \u043d\u0435\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0442\u0438\u043f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u043b\u0438 \u043d\u0435\u0442 (\u0437\u0434\u0435\u0441\u044c \u0432 <code>dependencies<\/code> \u0443\u0436\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u044b \u0432\u0441\u0435 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u0438\u0437 <code>di.container.tree.bindings<\/code>).<\/p>\n<pre><code class=\"kotlin\">  \/\/ 2   val missing = mutableListOf&lt;String>()   val directWrapper = DirectDIWrapper(di.direct) { clazz: TypeToken&lt;*> ->     val name = clazz.qualifiedDispString()     if (!dependencies.contains(name)) {       missing.add(name)     }   }<\/code><\/pre>\n<p><strong>\u0428\u0430\u0433 3 \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 Kodein<\/strong>. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u043c \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/p>\n<pre><code class=\"kotlin\">  \/\/ 3   val noArgBindingDI: NoArgBindingDI&lt;Any> =     NoArgBindingDIWrap(BindingDIImpl(directWrapper, key, 0))   noArgBindingDI.apply {     try {       (diBinding as? Singleton&lt;Any, T>)?.creator?.let { it() }       (diBinding as? Provider&lt;Any, T>)?.creator?.let { it() }       ...     } catch (e: Exception) {       println(           \"There was an error while initializing binding $diBinding, \" +               \"but for tests purposes it doesn't matter\"       )     }   } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c <code>BindingDIImpl<\/code> \u0441 \u043d\u0430\u0448\u0438\u043c <code>directWrapper<\/code> \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0438 \u043a\u043b\u044e\u0447\u043e\u043c <code>key<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0442\u0438\u043f\u0443 \u0443\u0433\u0430\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430, \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0451. \u0422\u0430\u043a \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0432\u0441\u0435\u043c <code>instance<\/code> \u043c\u0435\u0442\u043e\u0434\u0430\u043c, \u0430 \u043d\u0430\u0448 <code>directWrapper<\/code> \u043d\u0430\u0447\u043d\u0451\u0442 \u0434\u0451\u0440\u0433\u0430\u0442\u044c \u043a\u043e\u043b\u0431\u0435\u043a.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c, \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043e\u0448\u0438\u0431\u043a\u0435.<\/p>\n<pre><code class=\"kotlin\">  \/\/ 4   if (missing.isNotEmpty()) {     fail(\"Not all dependencies found for: ${T::class.java.canonicalName}. Missing: $missing\")   }<\/code><\/pre>\n<p>\u041e\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0430\u0440\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 \u043d\u0430 \u043d\u0430\u0448\u0443 \u0444\u0438\u0447\u0443\/\u044d\u043a\u0440\u0430\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"kotlin\">class ProductFragmentDITest {    ...      \/\/ \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 DI   private lateinit var diSUT: DI    \/\/ \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c   private lateinit var context: DITestContext    @Before   fun setup() {     diSUT = createDI()      \/\/ \u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0435\u0449\u0435 \u043f\u0430\u0440\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435     \/\/ \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0440\u0430\u0444\u0430.     context = DITestContext(         integrityRule = integrityRule,         parentDI = Create.unitScope.di,     )   }    \/\/ \u0421\u0430\u043c \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 1 \u0441\u0442\u0440\u043e\u0447\u043a\u0443   @Test   fun `SubDI of ProductFragment has integrity`() = withDIContext(context) {     assertDIHasIntegrity(diSUT)   } }<\/code><\/pre>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<ul>\n<li>\n<p>\u0412 DI \u043c\u0438\u0440\u0435 \u0435\u0441\u0442\u044c 2 \u0441\u0442\u0443\u043b\u0430: compile time \u0441\u0442\u0443\u043b \u0438 runtime. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f runtime DI, \u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430. \u041d\u043e \u043a\u0430\u043a \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441 \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u0430\u0444\u043e\u043c \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435? \u041e\u0442\u0432\u0435\u0442 \u0435\u0441\u0442\u044c! \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0432 deploy time, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 CI.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 CI \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u043d\u044f\u0442\u044c Unit-\u0442\u0435\u0441\u0442\u044b \u0438 UI-\u0442\u0435\u0441\u0442\u044b. \u041c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Unit-\u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430, \u2014 \u043e\u043d\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, deploy time \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u044f\u0442\u0441\u044f \u0441 compile time \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438: \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442, CI \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u0443\u043f\u0438\u0442\u044c, \u0442\u0435\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f, \u0433\u0434\u0435-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u0440\u0430\u0441\u0442\u044c\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041e\u0434\u043d\u0430\u043a\u043e deploy time \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 CI \u0432\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u043a\u0440\u0443\u0447\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e runtime. \u041e\u043d\u0438 \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u044f\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c Unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 DI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0444\u0440\u0435\u0439\u043c\u0444\u043e\u0440\u043a\u0430 Kodein. \u041d\u043e \u043f\u043e \u044d\u0442\u0438\u043c \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c runtime \u0444\u0440\u0435\u0439\u043c\u0444\u043e\u0440\u043a\u0435, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c Kodein \u0438 \u0432\u0430\u043c \u043e\u043d \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u0441 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u043c API, \u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u0442 compile time \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c Unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u044d\u0442\u043e \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 DI \u0432 \u0441\u0442\u0430\u0442\u0443\u0441 deploy time \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a!<\/p>\n<hr\/>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e! \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043c\u043e\u0439 \u043e\u043f\u044b\u0442, \u043d\u043e \u043b\u0435\u043d\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u044b, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 Telegram-\u043a\u0430\u043d\u0430\u043b \u00ab<a href=\"https:\/\/t.me\/mobilefiction\">\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e<\/a>\u00bb. \u0412 \u043d\u0451\u043c \u044f \u0434\u0435\u043b\u044e\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043c\u044b\u0441\u043b\u044f\u043c\u0438 \u043f\u0440\u043e Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u0432. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0435\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 Dodo \u0432 \u0446\u0435\u043b\u043e\u043c, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 Telegram-\u043a\u0430\u043d\u0430\u043b <a href=\"https:\/\/t.me\/dodoMobile\">Dodo Mobile<\/a>. \u0422\u0430\u043c \u043c\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 <a href=\"https:\/\/habr.com\/ru\/users\/akaDuality\/\">\u041c\u0438\u0448\u0430 \u0420\u0443\u0431\u0430\u043d\u043e\u0432<\/a> \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445, \u0434\u0438\u0437\u0430\u0439\u043d\u0435, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0430 \u0435\u0449\u0451 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f\u043c\u0438.<\/p>\n<p>\u042d\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u0440\u043e Kodein DI \u0434\u043b\u044f Android:<\/p>\n<p>\u0427\u0430\u0441\u0442\u044c 1:\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/755288\/\">Kodein DI \u0434\u043b\u044f Android. \u041e\u0441\u043d\u043e\u0432\u044b API<\/a><\/p>\n<p>\u0427\u0430\u0441\u0442\u044c 2: <a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/766058\/?code=1c99a063f9a3a1550d12e4baef9421b5&amp;state=lVkmrZhVrYCJLYi4fv5EfZco&amp;hl=ru\">Kodein DI \u0434\u043b\u044f Android. KMP \u0438 Compose<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/companies\/dododev\/articles\/807969\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u041a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f DI \u0442\u0435\u0431\u0435 \u0431\u043b\u0438\u0436\u0435?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">40% <\/span><span class=\"tm-article-poll__answer-label\">\u0422\u043e\u043b\u044c\u043a\u043e Compile time DI! \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e!<\/span><span class=\"tm-article-poll__answer-votes\">4<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 40%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">30% <\/span><span class=\"tm-article-poll__answer-label\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Runtime DI, \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0432\u0438\u0436\u0443.<\/span><span class=\"tm-article-poll__answer-votes\">3<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 30%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">10% <\/span><span class=\"tm-article-poll__answer-label\">\u0423\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Deploy time \u2014 \u043f\u043e\u043b\u0451\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439!<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 10%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">10% <\/span><span class=\"tm-article-poll__answer-label\">Deploy time \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0437\u0432\u0443\u0447\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e! \u041d\u0430\u0434\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c.<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 10%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">10% <\/span><span class=\"tm-article-poll__answer-label\">\u0412\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044e\u0441\u044c \u043e\u0431 \u044d\u0442\u043e\u043c.<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 10%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 10 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043d\u0435\u0442. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/807969\/\"> https:\/\/habr.com\/ru\/articles\/807969\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>DI \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u043e\u0432: \u0442\u0435, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u044f\u0442 \u0441\u0432\u043e\u0439 \u0433\u0440\u0430\u0444 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (compile time \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438), \u0438 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 (runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438).<\/p>\n<p><a href=\"https:\/\/github.com\/kosi-libs\/Kodein\">Kodein<\/a> \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435: \u0432\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u0435\u0439\u0441, \u0438 \u0443 \u0432\u0430\u0441 \u043a\u0440\u0430\u0448 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0438\u0437-\u0437\u0430 DI! \u042d\u0442\u043e \u0436\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043a\u043e\u0448\u043c\u0430\u0440!<\/p>\n<p>\u041d\u043e \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 Kodein \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432? \u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u043c\u0438? \u0415\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442! \u041c\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u043d\u0430\u0448 DI \u0438\u0437 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 runtime \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u0440\u0430\u0437\u0440\u044f\u0434 deploy time \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.<\/p>\n<p>\u042d\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u0440\u043e Kodein DI \u0434\u043b\u044f Android:<\/p>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 1:\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/755288\/\">Kodein DI \u0434\u043b\u044f Android. \u041e\u0441\u043d\u043e\u0432\u044b API<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 2: <a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/766058\/?code=1c99a063f9a3a1550d12e4baef9421b5&amp;state=lVkmrZhVrYCJLYi4fv5EfZco&amp;hl=ru\">Kodein DI \u0434\u043b\u044f Android. KMP \u0438 Compose<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 3: Kodein DI \u0434\u043b\u044f Android. \u0426\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 DI<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0433\u043d\u0430\u043b\u0438.<\/p>\n<h3>DI \u0433\u0440\u0430\u0444<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c DI \u0433\u0440\u0430\u0444\u0430. \u041f\u043e\u0434 DI \u0433\u0440\u0430\u0444\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u0425\u043e\u0442\u044f \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u0444\u0430, \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 \u043e\u0434\u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u0444, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u2014 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0447\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439). \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445 \u00ab\u0433\u0440\u0430\u0444\u00bb \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u0430\u044f, \u0430 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u0432\u044f\u0437\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0433\u0440\u0430\u0444.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u0427\u0442\u043e \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 DI? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u0430\u0444\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>\u2014 \u0423\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0413\u0440\u0430\u0444, \u0434\u0430\u0439 \u043c\u043d\u0435 \u043a\u043b\u0430\u0441\u0441 A!<\/p>\n<p>\u2014 \u0423\u043f\u0441, \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f A \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0430\u0441\u0441 B, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043c\u0435\u043d\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u043e\u0445\u043e\u0436\u0435, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c\u044e ?<\/p>\n<h3>\u0426\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0432 Kodein<\/h3>\n<p>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 Kodein. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439  \u043c\u043e\u0434\u0443\u043b\u044c:<\/p>\n<pre><code class=\"kotlin\">fun moduleOfAuth() = DI.Module(\"authModule\") { bind&lt;PhoneEndpoint>() with singleton {    instance&lt;Retrofit>().create(PhoneEndpoint::class.java)  }  bind&lt;PhoneDataSource>() with singleton {   PhoneDataSourceImpl(        phoneEndpoint = instance(),        mapper = instance(),   ) } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>PhoneDataSourceImpl<\/code> \u043d\u0443\u0436\u0435\u043d <code>mapper<\/code>, \u043d\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 &#171;authModule&#187; <code>mapper<\/code> \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d. \u0415\u0441\u043b\u0438 <code>mapper<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0433\u0440\u0430\u0444 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c, \u0438\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435, \u0442\u043e \u043d\u0430\u0448 \u0433\u0440\u0430\u0444 \u0431\u0443\u0434\u0435\u0442 <strong>\u043d\u0435\u0446\u0435\u043b\u043e\u0441\u0442\u043d\u044b\u043c<\/strong>, \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>PhoneDataSourceImpl<\/code> Kodein \u043a\u0438\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f \u0434\u0430\u043b\u0435\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 <em>Injection<\/em>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>Retrieval<\/em> (aka Service Locator).<\/p>\n<blockquote>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443, \u0430\u0432\u0442\u043e\u0440\u044b Kodein <a href=\"https:\/\/kosi-libs.org\/kodein\/7.21\/core\/injection-retrieval.html#_injection_retrieval\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0441 \u0447\u0435\u043c \u044f \u043d\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d, \u0438 \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">class MyRepositoryImpl(di: DIAware) : MyRepository, DIAware by di {    ...   private val endpoint by instance&lt;Endpoint>()   ... }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f, \u043c\u044b, \u0447\u0438\u0442\u0430\u044f \u043a\u043e\u0434, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0435\u0433\u043e \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0422\u043e \u0437\u0434\u0435\u0441\u044c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u043e <code>by instance()<\/code>, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0415\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 <code>Endpoint<\/code>, \u0433\u0434\u0435 \u0435\u0433\u043e \u0438\u0441\u043a\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u0438 \u0442.\u0434.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 <em>Injection<\/em>, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0435\u0440\u044f\u0435\u043c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u2014 \u043c\u043e\u0434\u0443\u043b\u0435\u043c. \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0442\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043c\u043e\u0434\u0443\u043b\u0435. \u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <em>Retrieval<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0412 Kodein DI \u0433\u0440\u0430\u0444 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 runtime&#8217;\u0435, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 runtime&#8217;\u0435. \u042d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043e\u0437\u0434\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (<em>Injection<\/em>), \u043c\u044b \u0445\u043e\u0442\u044c \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044f\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u0433\u0440\u0430\u0444\u0430 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440). \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>Retrieval<\/em> \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u043e \u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0418 <em>Injection,<\/em> \u0438 <em>Retrieval<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043d\u0435 \u0434\u0430\u044e\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432 runtime&#8217;\u0435.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0420\u0435\u0448\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043a\u0443<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e Kodein \u2014 \u044d\u0442\u043e runtime \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, \u0438 \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0432 compile time \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0430 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u0443 \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439? \u0410 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0437\u0436\u0435 compile time \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 runtime? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014 deploy time! \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430\u0448 DI \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0441 deploy time \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 CI.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 CI? \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<ul>\n<li>\n<p>Unit-\u0442\u0435\u0441\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>UI-\u0442\u0435\u0441\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, UI-\u0442\u0435\u0441\u0442\u044b \u0440\u0435\u0448\u0430\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041d\u043e UI-\u0442\u0435\u0441\u0442\u044b \u2014 \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u0440\u043e\u0433\u043e. \u0410 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0451\u0448\u0435\u0432\u043e \u0438 \u0431\u044b\u0441\u0442\u0440\u043e. \u0417\u043d\u0430\u0447\u0438\u0442 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c Unit-\u0442\u0435\u0441\u0442\u044b!<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0435\u0440\u044b Kodein \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u0430\u0436\u043e\u0440\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438). \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043c\u043e\u0433\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c \u0438 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<p>\u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f 2 \u0448\u0430\u0433\u0430:<\/p>\n<ol>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e <em>Injection<\/em> \u043f\u043e\u0434\u0445\u043e\u0434. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (<em>Retrieval<\/em>) \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0448\u0435\u043c Unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430!<\/p>\n<\/li>\n<\/ol>\n<h3>\u0428\u0430\u0433 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e Injection \u043f\u043e\u0434\u0445\u043e\u0434<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439. \u0412\u043e\u0442 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c:<\/p>\n<pre><code class=\"kotlin\">class RepositoryImpl(di: DIAware) : Repository, DIAware by di {   ...   private val datasource by instance&lt;DataSource>()   private val mapper by instance&lt;Mapper>()   ...<\/code><\/pre>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">class RepositoryImpl(   private val datasource: DataSource,   private val mapper: Mapper, ) : Repository {  \/\/ Module bind&lt;Repository>() with singleton {   RepositoryImpl(     datasource = instance(),     mapper = instance(),   ) }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u0431\u044b\u043b \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0430\u0433, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443!<\/p>\n<h3>\u0428\u0430\u0433 2. Unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 DI<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0430\u0448\u0438\u0445 DI \u0433\u0440\u0430\u0444\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><strong>AppDI<\/strong>. \u042d\u0442\u043e \u0433\u0440\u0430\u0444 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Dagger 2 \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 AppComponent. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e singleton \u0441\u043a\u043e\u0443\u043f \u0438 \u0442\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0431\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>ContextDI<\/strong>. \u042d\u0442\u043e \u0433\u0440\u0430\u0444 \u0441 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u0422.\u0435. \u044d\u0442\u043e \u0433\u0440\u0430\u0444 \u0433\u0440\u0443\u043f\u043f\u044b \u0444\u0438\u0447 \u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d\u0431\u043e\u0440\u0434\u0438\u043d\u0433, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>FeatureDI<\/strong>. \u042d\u0442\u043e \u0433\u0440\u0430\u0444 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0444\u0438\u0447\u0438, \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u044d\u0442\u0438 3 DI \u0433\u0440\u0430\u0444\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c-\u0440\u0435\u0431\u0451\u043d\u043e\u043a. \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 Kodein. \u041e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u044b <code>subDI<\/code>, \u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c <code>SubComponent<\/code> \u0432 Dagger 2.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 <strong>\u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430.<\/strong> \u0418 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0442\u0432\u0435\u0442 (\u0442\u043e, \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043d\u0430\u0448 DI \u0442\u0435\u0441\u0442):<\/p>\n<pre><code class=\"kotlin\">  @Test   fun `SubDI of ProductFragment has integrity`() = diTest {     assertDIHasIntegrity(diSUT)   }<\/code><\/pre>\n<p>\u041f\u043e\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<ul>\n<li>\n<p>\u042f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e <code>assertDIHasIntegrity<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u0443\u043f-\u043c\u0435\u0442\u043e\u0434 <code>diTest<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430 \u0441\u0445\u0435\u043c\u043a\u0435<\/h3>\n<p>\u041a\u0430\u043a \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0433\u0440\u0430\u0444 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u2014 \u0435\u0441\u0442\u044c 3 \u043c\u043e\u0434\u0443\u043b\u044f \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0421\u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e, \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0433\u0440\u0430\u0444\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0432\u0441\u0435\u0433\u043e \u043b\u0438 \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0430 \u0433\u0438\u0444\u043a\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u043b\u044f <code>a1<\/code>, <code>a2<\/code>, <code>b1<\/code> \u2014 \u0432\u0441\u0435\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0410 \u0432\u043e\u0442 \u0434\u043b\u044f <code>c1<\/code> \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <code>d1<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 \u00ab\u0432\u043d\u0435\u0448\u043d\u0438\u0439\u00bb \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0448 DI \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c (<code>subDI<\/code>) \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 DI.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u0432\u0441\u0451 \u043e\u043a \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0415\u0441\u043b\u0438 \u0438\u0445 \u0442\u0430\u043c \u043d\u0435\u0442, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430.<\/p>\n<h3>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <code>Presenter<\/code> \u0444\u0430\u0431\u0440\u0438\u043a\u0430 <code>provider<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u043c <code>PresenterImp<\/code> \u0441 \u0442\u0440\u0451\u043c\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>instance()<\/code>.<\/p>\n<pre><code class=\"kotlin\">bind&lt;Presenter>() with provider {     PresenterImpl(         mapper = instance(),         voFactory = instance(),         interactor = instance(),     ) }<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f <code>Presenter<\/code>, \u0433\u0434\u0435-\u0442\u043e \u0432 \u0433\u0440\u0430\u0444\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <code>mapper<\/code>, <code>voFactory<\/code> \u0438 <code>interactor<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u00ab\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c\u00bb \u0432\u044b\u0437\u043e\u0432\u044b <code>instance()<\/code> \u0438 \u0443\u0437\u043d\u0430\u0442\u044c, \u0441 \u043a\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u044b. \u0415\u0441\u043b\u0438 \u043c\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u043d\u0443\u0436\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <code>PresenterImpl<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>DirectDIBase<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <code>Instance<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442.<\/p>\n<pre><code class=\"kotlin\">public interface DirectDIBase : DirectDIAware {   ...   public fun &lt;T : Any> Instance(type: TypeToken&lt;T>, tag: Any? = null): T   ... }<\/code><\/pre>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>DirectDIBase<\/code> \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 <code>DirectDIBaseImpl<\/code>, \u0433\u0434\u0435, \u043a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043c\u0435\u0442\u043e\u0434 <code>Instance<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043c\u0435\u0442\u043e\u0434 <code>provider<\/code>.<\/p>\n<pre><code class=\"kotlin\">internal abstract class DirectDIBaseImpl: DirectDI {     override fun &lt;T : Any> Instance(type: TypeToken&lt;T>, tag: Any?): T {         return container.provider(             key = DI.Key(                 contextType = context.anyType,                 argType = TypeToken.Unit,                 type = type,                 tag = tag,             ),             context = context.value         ).invoke()     } }<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e <code>DirectDIWrapper<\/code>. \u0418 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043c 2 \u0432\u0435\u0449\u0438:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>Instance<\/code> \u043c\u044b \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043b\u0431\u0435\u043a <code>instanceCallback<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043d\u0430\u0440\u0443\u0436\u0443, \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e-\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 mock. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u0430 \u043e\u043d \u043d\u0430\u043c \u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">class DirectDIWrapper(   private val _directDI: DirectDI,   private val instanceCallback: <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-373743","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/373743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=373743"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/373743\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=373743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=373743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=373743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}