{"id":369067,"date":"2024-05-21T03:55:37","date_gmt":"2024-05-21T03:55:37","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=369067"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T03:55:37","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=369067","title":{"rendered":"<span>Pure.DI v2.1<\/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<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\" rel=\"noopener noreferrer nofollow\"><em>Pure.DI<\/em><\/a> \u0432\u0435\u0440\u0441\u0438\u0438 2.0 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u0433\u043e\u0434\u0430. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043e\u0442\u0437\u044b\u0432\u044b \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0438\u0447, \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043c\u0435\u043b\u043a\u0438\u0435 \u043d\u0435\u0434\u043e\u0447\u0435\u0442\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 2.1, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/133\/ed2\/b8b\/133ed2b8b3ffc3f87003d904a367b7fa.gif\" alt=\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430\u043b\u0435\u0442\u0443\" title=\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430\u043b\u0435\u0442\u0443\" width=\"1652\" height=\"944\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/133\/ed2\/b8b\/133ed2b8b3ffc3f87003d904a367b7fa.gif\"\/><\/p>\n<div><figcaption>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430\u043b\u0435\u0442\u0443<\/figcaption><\/div>\n<\/figure>\n<h2>\u0412\u0440\u0435\u043c\u0435\u043d\u0430 \u0436\u0438\u0437\u043d\u0438 PerBlock \u0438 Scoped<\/h2>\n<p>&#171;\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Dependency Injection &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0441\u0440\u043e\u043a \u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u0445\u043e\u043b\u043e\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u0435: \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445 \u0441\u043f\u0443\u0441\u0442\u044f \u0440\u0443\u043a\u0430\u0432\u0430, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u0440\u0447\u0435\u043d\u043d\u044b\u043c\u0438&#187; (\u0441) YaGPT 2. \u0412 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 &#8212; \u043d\u0435\u0432\u0435\u0440\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0439 \u0442\u0440\u0430\u0442\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432: \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <em>Pure.DI<\/em> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0436\u0438\u0437\u043d\u0438:<\/p>\n<ul>\n<li>\n<p><em>Transient<\/em> &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)<\/p>\n<\/li>\n<li>\n<p><em>Singleton<\/em> &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u0440\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><em>PerResolve<\/em> &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0432\u0441\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 &#8212; <em>PerResolve<\/em>. \u042d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 &#8212; &#171;<em>Singleton<\/em> \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u043a\u0430\u0445&#187;, \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/perresolve.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">interface IDependency;  class Dependency : IDependency;  class Service {   public Service(     IDependency dep1,     IDependency dep2,     Lazy&lt;(IDependency dep3, IDependency dep4)> deps)   {     Dep1 = dep1;     Dep2 = dep2;     Dep3 = deps.Value.dep3;     Dep4 = deps.Value.dep4;   }    public IDependency Dep1 { get; }    public IDependency Dep2 { get; }    public IDependency Dep3 { get; }      public IDependency Dep4 { get; } }  DI.Setup(nameof(Composition))   .Bind&lt;IDependency>().As(Lifetime.PerResolve).To&lt;Dependency>()   .Root&lt;Service>(\"Root\");  var composition = new Composition();  var service1 = composition.Root; service1.Dep1.ShouldBe(service1.Dep2); service1.Dep3.ShouldBe(service1.Dep4); service1.Dep1.ShouldBe(service1.Dep3);  var service2 = composition.Root; service2.Dep1.ShouldNotBe(service1.Dep1);<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c <em>service1<\/em>, \u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 <em>Dependency1<\/em>, <em>Dependency2, Dependency3, Dependency4<\/em> \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442. \u0414\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c <em>service2<\/em> \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 &#8212; \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cs\">partial class Composition {   public IService Root   {     var dependency = default(Dependency);     var funcDeps = new Func&lt;(IDependency dep3, IDependency dep4)>(     () =>     {       if (ReferenceEquals(dependency, null))       {         lock (_lock)         {           if (ReferenceEquals(dependency, null))           {             dependency = new Dependency();           }         }       }        return (dependency, dependency);     });          var lazyDeps = new Lazy&lt;(IDependency dep3, IDependency dep4)>(funcDeps, true);            if (ReferenceEquals(dependency, null))     {       lock (_lock)       {         if (ReferenceEquals(dependency, null))         {           dependency = new Dependency();         }       }     }          return new Service(dependency, dependency, lazyDeps);   } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043a\u043e\u0433\u0434\u0430 <em>PerResolve<\/em> \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <em>Dependency<\/em>, \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e \u0432 \u043b\u044f\u043c\u0431\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 <em>IEnumerable&lt;T>, Lazy&lt;T><\/em> \u0438 \u0442.\u0434. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0442\u0440\u0430\u0442\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435\u0441\u0442\u043a\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0440\u0435\u0437\u043c\u0435\u0440\u043d\u043e, \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0431\u0435\u0437 \u0444\u0430\u043d\u0430\u0442\u0438\u0437\u043c\u0430, \u0442.\u0435. \u0431\u0435\u0437 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0438\u0445 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;. \u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>PerBlock &#8212;<\/em> \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/perblock.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">DI.Setup(nameof(Composition))   \/\/ PerResolve -> PerBlock   .Bind&lt;IDependency>().As(Lifetime.PerBlock).To&lt;Dependency>()   .Root&lt;Service>(\"Root\");  var composition = new Composition();  var service1 = composition.Root; service1.Dep1.ShouldBe(service1.Dep2); service1.Dep3.ShouldBe(service1.Dep4); service1.Dep1.ShouldNotBe(service1.Dep3);  var service2 = composition.Root; service2.Dep1.ShouldNotBe(service1.Dep1);<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043d\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c <em>service1<\/em> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0434\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 <em>Dependency<\/em>:<\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0432\u044b\u0439 &#8212; \u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <em>Dependecy1<\/em> \u0438 <em>Dependecy2<\/em><\/p>\n<\/li>\n<li>\n<p>\u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a <em>deps, <\/em>\u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <em>Dependecy3<\/em> \u0438 <em>Dependecy4<\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">partial class Composition {   public Service Root   {     var funcDeps = new Func&lt;(IDependency dep3, IDependency dep4)>(     () =>     {         \/\/ \u0432\u0442\u043e\u0440\u043e\u0439         var dependency34 = new Dependency();         return (dependency34, dependency34);     });          var lazyDeps = new Lazy&lt;(IDependency dep3, IDependency dep4)>(funcDeps, true);      \/\/ \u043f\u0435\u0440\u0432\u044b\u0439     var dependency12 = new Dependency();     return new Service(dependency12, dependency12, lazyDeps);   } }<\/code><\/pre>\n<p>\u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c&#187; \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <em>Dependency<\/em> \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <em>PerBlock<\/em> \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;, \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>PerBlock<\/em> \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 <em>Pure.DI <\/em>\u0432\u0435\u0440\u0441\u0438\u0438 2.1 &#8212; \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>Scoped<\/em>. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/dependency-injection\" rel=\"noopener noreferrer nofollow\">Microsoft Dependency Injection<\/a> \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0436\u0438\u0437\u043d\u0438 <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/dependency-injection#scoped\" rel=\"noopener noreferrer nofollow\"><em>Scoped<\/em><\/a>:<\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c&#187; \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 (\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 <em>Pure.DI<\/em> \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>Scoped<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0435, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/scope.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">interface IDependency {   bool IsDisposed { get; } }  class Dependency : IDependency, IDisposable {   public bool IsDisposed { get; private set; }    public void Dispose() => IsDisposed = true; }  interface IService {   IDependency Dependency { get; } }  class Service(IDependency dependency) : IService {   public IDependency Dependency => dependency; }  \/\/ Implements a session class Session(Composition composition) : Composition(composition);  class Program(Func&lt;Session> sessionFactory) {   public Session CreateSession() => sessionFactory(); }  partial class Composition {   private static void Setup() =>     DI.Setup(nameof(Composition))       .Bind&lt;IDependency>().As(Scoped).To&lt;Dependency>()       .Bind&lt;IService>().To&lt;Service>()       \/\/ Session composition root       .Root&lt;IService>(\"SessionRoot\")       \/\/ Program composition root       .Root&lt;Program>(\"ProgramRoot\"); }  var composition = new Composition(); var program = composition.ProgramRoot;          \/\/ Creates session #1 var session1 = program.CreateSession(); var dependency1 = session1.SessionRoot.Dependency; var dependency12 = session1.SessionRoot.Dependency;          \/\/ Checks the identity of scoped instances in the same session dependency1.ShouldBe(dependency12);          \/\/ Creates session #2 var session2 = program.CreateSession(); var dependency2 = session2.SessionRoot.Dependency;          \/\/ Checks that the scoped instances are not identical in different sessions dependency1.ShouldNotBe(dependency2);          \/\/ Disposes of session #1 session1.Dispose(); \/\/ Checks that the scoped instance is finalized dependency1.IsDisposed.ShouldBeTrue();          \/\/ Disposes of session #2 session2.Dispose(); \/\/ Checks that the scoped instance is finalized dependency2.IsDisposed.ShouldBeTrue();<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 <em>session1<\/em> \u0438 <em>session2<\/em>. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <em>Dependency. <\/em>\u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0451 <em>Scoped <\/em>\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0438\u043f\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 &#8212; \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>Scoped<\/em>, \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #35<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0442\u0438\u043f (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e) \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0442\u0438\u043f <em>Session<\/em> \u0432 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043a\u043e\u0434\u0430 #24<\/p>\n<\/li>\n<li>\n<p>\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0439 \u043b\u0435\u043d\u0438\u0432\u043e, \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #26, \u0433\u0434\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0430 <em>Func&lt;Session><\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">partial class Composition: IDisposable {   private readonly Composition _root;   private readonly object _lock;   readonly IDisposable[] _disposables;   private int _disposeIndex;   private Dependency _scopedDependency;    public Composition()   {     _root = this;     _lock = new object();     _disposables = new IDisposable[1];   }    internal Composition(Composition baseComposition)   {     _root = baseComposition._root;     _lock = _root._lock;     _disposables = new IDisposable[1];   }    \/\/\/ &lt;summary>   \/\/\/ Program composition root   \/\/\/ &lt;\/summary>   public Program ProgramRoot   {     get     {       var sessionFactory = new Func&lt;Session>(() => new Session(this));       return new Program(sessionFactory);     }   }    \/\/\/ &lt;summary>   \/\/\/ Session composition root   \/\/\/ &lt;\/summary>   public IService SessionRoot   {     get     {       if (ReferenceEquals(_scopedDependency, null))       {         lock (_lock)         {           if (ReferenceEquals(_scopedDependency, null))           {             _scopedDependency = new Dependency();             _disposables[_disposeIndex++] = _scopedDependency;           }         }               }              return new Service(_scopedDependency);     }   }    public void Dispose()   {     lock (_lock)     {       while (_disposeIndex > 0)       {         var disposableInstance = _disposables[--_disposeIndex];         try         {           disposableInstance.Dispose();         }         catch(Exception exception)         {           OnDisposeException(disposableInstance, exception);         }       }              _scopedDependency = null;     }   } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #16. \u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430 <em>Dispose() \u0434\u043b\u044f \u0441\u0435\u0441\u0441\u0438\u0438<\/em>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <em>OnDisposeException<\/em>. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u0442\u0435\u043b\u043e \u0432 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<h2>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0440\u043d\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/h2>\n<p>\u0412 \u0432\u0435\u0440\u0441\u0438\u0438 2.0 <em>Pure.DI<\/em> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430<\/em>, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/arguments.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">interface IDependency {   int Id { get; } }  class Dependency(int id) : IDependency {   public int Id { get; } = id; }  interface IService {   string Name { get; }    IDependency Dependency { get; } }  class Service(   [Tag(\"name\")] string name,   IDependency dependency) : IService {   public string Name { get; } = name;    public IDependency Dependency { get; } = dependency; }  DI.Setup(nameof(Composition))   .Bind&lt;IDependency>().To&lt;Dependency>()   .Bind&lt;IService>().To&lt;Service>()   .Root&lt;IService>(\"Root\")   \/\/ Some kind of identifier   .Arg&lt;int>(\"id\")   \/\/ An argument can be tagged (e.g., tag \"name\")   \/\/ to be injectable by type and this tag   .Arg&lt;string>(\"serviceName\", \"name\");  var composition = new Composition(serviceName: \"Abc\", id: 123);          \/\/ service = new Service(\"Abc\", new Dependency(123)); var service = composition.Root;          service.Name.ShouldBe(\"Abc\"); service.Dependency.Id.ShouldBe(123);<\/code><\/pre>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <em>Arg&lt;TArg>(argName)<\/em> \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #32. \u041f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0412 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #37 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <em>serviceName<\/em> \u0438 <em>id<\/em>. \u0418\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u044b \u043b\u044e\u0431\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041e\u043d\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u043b\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cs\">partial class Composition {   private readonly int _id;   private readonly string _serviceName;    public Composition(int id, string serviceName)   {     _id = id;     _serviceName = serviceName;   }    public IService Root   {     get     {       return new Service(_serviceName, new Dependency(_id));     }   } }<\/code><\/pre>\n<p>\u0423 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 <em>Pure.DI<\/em> \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u0440\u043d\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 &#8212; <em>\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0440\u043d\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u0435\u0442\u043e\u0434 <em>RootArg&lt;TArg>(string argName)<\/em>, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/root-arguments.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">interface IDependency {   int Id { get; }      public string DependencyName { get; } }  class Dependency(int id, string dependencyName) : IDependency {   public int Id { get; } = id;    public string DependencyName { get; } = dependencyName; }  interface IService {   string Name { get; }      IDependency Dependency { get; } }  class Service(   [Tag(\"forService\")] string name,   IDependency dependency)   : IService {   public string Name { get; } = name;    public IDependency Dependency { get; } = dependency; }   DI.Setup(nameof(Composition))   .Bind&lt;IDependency>().To&lt;Dependency>()   .Bind&lt;IService>().To&lt;Service>().Root&lt;IService>(\"CreateService\")   \/\/ Some argument   .RootArg&lt;int>(\"id\")   .RootArg&lt;string>(\"dependencyName\")   \/\/ An argument can be tagged (e.g., tag \"forService\")   \/\/ to be injectable by type and this tag   .RootArg&lt;string>(\"serviceName\", \"forService\");  var composition = new Composition();  var service = composition.CreateService(   serviceName: \"Abc\",   id: 123,   dependencyName: \"dependency 123\");  service.Name.ShouldBe(\"Abc\"); service.Dependency.Id.ShouldBe(123); service.Dependency.DependencyName.ShouldBe(\"dependency 123\");<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <em>serviceName<\/em> \u0438 <em>dependencyName<\/em> \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0442\u0438\u043f <em>string<\/em>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u0430 \u043e\u043d\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d  \u043a\u0430\u0436\u0434\u044b\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u044d\u0433\u0438. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0435\u0433 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <em>&#171;forService&#187;<\/em> \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 #40 \u0438 #23. \u0422\u0435\u0433\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cs\">partial class Composition {   public IService CreateService(     int id,     string dependencyName,     string serviceName)   {     return new Service(       serviceName,       new Dependency(id, dependencyName));   } }<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u0440\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <em>CreateService<\/em> &#171;\u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f&#187; \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<h2>\u041d\u043e\u0432\u044b\u0435 BCL \u0442\u0438\u043f\u044b \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438<\/h2>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u0442\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u043a\u0430\u043a <em>ICollection&lt;T>, IList&lt;T>, IReadOnlyCollection&lt;T>, IReadOnlyList&lt;T>, ISet&lt;T>, Queue&lt;T>, ImmutableArray&lt;T>, Lazy&lt;T>,<\/em> \u0438 \u043c\u043d\u043e\u0433\u0438\u043c \u0434\u0440\u0443\u0433\u0438\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 BCL. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0433\u043e\u0442\u043e\u0432\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/weak-reference.md\" rel=\"noopener noreferrer nofollow\">WeakReference<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/async-enumerable.md\" rel=\"noopener noreferrer nofollow\">IAsyncEnumerable&lt;T><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/task.md\" rel=\"noopener noreferrer nofollow\">Task&lt;T><\/a><\/p>\n<ul>\n<li>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/task.md\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a><\/p>\n<\/li>\n<li>\n<p>\u0412 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/manually-started-tasks.md\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a> \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/valuetask.md\" rel=\"noopener noreferrer nofollow\">ValueTask&lt;T><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.random\" rel=\"noopener noreferrer nofollow\">Random<\/a><\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f\u044b \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent\" rel=\"noopener noreferrer nofollow\">System.Collections.Concurrent<\/a>:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent.iproducerconsumercollection-1\" rel=\"noopener noreferrer nofollow\">IProducerConsumerCollection&lt;T><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent.concurrentbag-1\" rel=\"noopener noreferrer nofollow\">ConcurrentBag&lt;T><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent.concurrentqueue-1\" rel=\"noopener noreferrer nofollow\">ConcurrentQueue&lt;T><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent.concurrentstack-1\" rel=\"noopener noreferrer nofollow\">ConcurrentStack&lt;T><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent.blockingcollection-1\" rel=\"noopener noreferrer nofollow\">BlockingCollection&lt;T><\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0431\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 BCL, \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 .NET \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f <a rel=\"noopener noreferrer nofollow\">ValueTask&lt;T><\/a> \u0433\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 .NET Core 1+, NET 5+, \u0438 \u0434\u043b\u044f .NET Standard 2.1+. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f BCL \u0442\u0438\u043f\u043e\u0432 \u0438 .NET \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/src\/Pure.DI.Core\/Features\/Default.g.cs\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435<\/a>. \u0411\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u041d\u0415 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/auto-bindings.md\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a>. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0438\u043f\u0430: \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441 <em>Transient<\/em> \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043d\u0438\u0436\u0435 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.lazy-1\" rel=\"noopener noreferrer nofollow\">Lazy&lt;T><\/a>:<\/p>\n<pre><code class=\"cs\">.Bind&lt;Lazy&lt;TT>>()   .To(ctx =>   {       ctx.Inject&lt;Func&lt;TT>>(ctx.Tag, out var factory);       return new Lazy&lt;TT>(factory, true);   })<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.lazy-1.-ctor\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/a>, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>isThreadSafe<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <em>true<\/em> \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 <em>Lazy&lt;T><\/em> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<h2>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438<\/h2>\n<p>\u0412 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <em>Pure.DI<\/em> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. \u0414\u043b\u044f <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/auto-bindings.md\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440\u0430<\/a>:<\/p>\n<pre><code class=\"cs\">class Dependency;  class Service(Dependency dependency);  \/\/ Specifies to create a partial class \"Composition\" DI.Setup(\"Composition\")   \/\/ Specifies to create a property \"MyService\"   .Root&lt;Service>(\"MyService\");          var composition = new Composition(); var service = composition.MyService;<\/code><\/pre>\n<p>\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e  \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c:<\/p>\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ &lt;para> \/\/\/ Specifies to create a partial class \"Composition\" \/\/\/ &lt;\/para> \/\/\/ &lt;para> \/\/\/ Composition roots:&lt;br\/> \/\/\/ &lt;list type=\"table\"> \/\/\/ &lt;listheader> \/\/\/ &lt;term>Root&lt;\/term> \/\/\/ &lt;description>Description&lt;\/description> \/\/\/ &lt;\/listheader> \/\/\/ &lt;item> \/\/\/ &lt;term> \/\/\/ &lt;see cref=\"Service\"\/> MyService \/\/\/ &lt;\/term> \/\/\/ &lt;description> \/\/\/ Specifies to create a property \"MyService\" \/\/\/ &lt;\/description> \/\/\/ &lt;\/item> \/\/\/ &lt;\/list> \/\/\/ &lt;\/para> \/\/\/ &lt;example> \/\/\/ This shows how to get an instance of type &lt;see cref=\"Service\"\/> using the composition root &lt;see cref=\"MyService\"\/>: \/\/\/ &lt;code> \/\/\/ var composition = new Composition(); \/\/\/ var instance = composition.MyService; \/\/\/ &lt;\/code> \/\/\/ &lt;\/example> \/\/\/ &lt;a href=\"https:\/\/mermaid.live\/view#pako:eNp1UMsOgjAQ_JVmzx4IHFBuYDl68tpL02600bakRRNC-HehSHiIl8nuTmZ2Mi0IKxEyEE_uPVX85rhmjpmwk7PVlfWqVtYQ9oqitBi4YYqLK7q3EkguzXeaqJTOBhQrNBKNaH70MxX2Y8DTnsn06U-CUb74JNfOG8-lW5wHpCOSbdwkX1wG7baPuJwxKVdBe-1uQ3AAjU5zJfvWWwb1HTUyyBhI7h4MOug-cCKKWQ\">Class diagram&lt;\/a>&lt;br\/> \/\/\/ This class was created by &lt;a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\">Pure.DI&lt;\/a> source code generator. \/\/\/ &lt;\/summary> \/\/\/ &lt;seealso cref=\"Pure.DI.DI.Setup\"\/> partial class Composition {   \/\/\/ &lt;summary>   \/\/\/ Specifies to create a property \"MyService\"   \/\/\/ &lt;\/summary>   public Service MyService   {     get     {       return new Service(new Dependency());     }   } }<\/code><\/pre>\n<p>\u0412 IDE Rider \u044d\u0442\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/98c\/cd5\/c83\/98ccd5c83a4bd79f4d1e89f50f6ad3fa.png\" alt=\"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043a\u043e\u0440\u043d\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 MyService\" title=\"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043a\u043e\u0440\u043d\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 MyService\" width=\"1559\" height=\"302\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98c\/cd5\/c83\/98ccd5c83a4bd79f4d1e89f50f6ad3fa.png\"\/><\/p>\n<div><figcaption>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043a\u043e\u0440\u043d\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 <em>MyService<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/425\/5d8\/a05\/4255d8a05c34431e6747ad6337ae1488.png\" alt=\"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043a\u043b\u0430\u0441\u0441\u0443 Composition\" title=\"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043a\u043b\u0430\u0441\u0441\u0443 Composition\" width=\"1495\" height=\"907\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/425\/5d8\/a05\/4255d8a05c34431e6747ad6337ae1488.png\"\/><\/p>\n<div><figcaption>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043a\u043b\u0430\u0441\u0441\u0443 <em>Composition<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u0438\u0445 \u0442\u0438\u043f\u043e\u043c \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u043d\u0435\u0439, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b26\/ddf\/3b5\/b26ddf3b5c3eff62aabd553ae7306cf1.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432\" width=\"564\" height=\"821\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b26\/ddf\/3b5\/b26ddf3b5c3eff62aabd553ae7306cf1.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b <em>Pure.DI<\/em> \u0431\u044b\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u043b\u0435\u0433\u0447\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u0430\u0445 .NET \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0442 \u0438\u0445 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<ul>\n<li>\n<p>Console<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/Console.md\" rel=\"noopener noreferrer nofollow\"><u>Schr\u00f6dinger&#8217;s cat<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/ConsoleTopLevelStatements.md\" rel=\"noopener noreferrer nofollow\"><u>Top level statements<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/ConsoleNativeAOT.md\" rel=\"noopener noreferrer nofollow\"><u>Native AOT<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>UI<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/Maui.md\" rel=\"noopener noreferrer nofollow\"><u>MAUI<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/Wpf.md\" rel=\"noopener noreferrer nofollow\"><u>WPF<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/Avalonia.md\" rel=\"noopener noreferrer nofollow\"><u>Avalonia<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/WinFormsAppNetCore.md\" rel=\"noopener noreferrer nofollow\"><u>Win Forms Net Core<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/WinFormsApp.md\" rel=\"noopener noreferrer nofollow\"><u>Win Forms<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Web<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/WebApp.md\" rel=\"noopener noreferrer nofollow\"><u>Web<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/MinimalWebAPI.md\" rel=\"noopener noreferrer nofollow\"><u>Minimal Web API<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/WebAPI.md\" rel=\"noopener noreferrer nofollow\"><u>Web API<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/GrpcService.md\" rel=\"noopener noreferrer nofollow\"><u>gRPC service<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/BlazorServerApp.md\" rel=\"noopener noreferrer nofollow\"><u>Blazor Server<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/BlazorWebAssemblyApp.md\" rel=\"noopener noreferrer nofollow\"><u>Blazor WebAssembly<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Git repo with examples<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI.Example\" rel=\"noopener noreferrer nofollow\"><u>Schr\u00f6dinger&#8217;s cat<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/DevTeam\/Pure.DI.Solution\" rel=\"noopener noreferrer nofollow\"><u>How to use Pure.DI to create libraries<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1cd\/c48\/519\/1cdc48519495b8c4e86e66a74c658049.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 Avalonia\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 Avalonia\" width=\"1536\" height=\"921\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1cd\/c48\/519\/1cdc48519495b8c4e86e66a74c658049.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/Avalonia.md\" rel=\"noopener noreferrer nofollow\">Avalonia<\/a><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db9\/3e6\/0f3\/db93e60f37fa794033cfb5fa81143a1e.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 Blazor WebAssembly\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 Blazor WebAssembly\" width=\"1414\" height=\"851\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db9\/3e6\/0f3\/db93e60f37fa794033cfb5fa81143a1e.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/BlazorWebAssemblyApp.md\" rel=\"noopener noreferrer nofollow\"><u>Blazor WebAssembly<\/u><\/a><\/figcaption><\/div>\n<\/figure>\n<h2>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 ))<\/h2>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0432\u044b\u0448\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043b\u043a\u0438\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/releases\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u0432<\/a>.<\/p>\n<p>\u041f\u043e\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0438 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u0442\u043e\u043d\u043a\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b. \u0418\u0445 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI?tab=readme-ov-file#generated-code\" rel=\"noopener noreferrer nofollow\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/795809\/\"> https:\/\/habr.com\/ru\/articles\/795809\/<\/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<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\" rel=\"noopener noreferrer nofollow\"><em>Pure.DI<\/em><\/a> \u0432\u0435\u0440\u0441\u0438\u0438 2.0 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u0433\u043e\u0434\u0430. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043e\u0442\u0437\u044b\u0432\u044b \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0438\u0447, \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043c\u0435\u043b\u043a\u0438\u0435 \u043d\u0435\u0434\u043e\u0447\u0435\u0442\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 2.1, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430\u043b\u0435\u0442\u0443<\/figcaption><\/div>\n<\/figure>\n<h2>\u0412\u0440\u0435\u043c\u0435\u043d\u0430 \u0436\u0438\u0437\u043d\u0438 PerBlock \u0438 Scoped<\/h2>\n<p>&#171;\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Dependency Injection &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0441\u0440\u043e\u043a \u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u0445\u043e\u043b\u043e\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u0435: \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445 \u0441\u043f\u0443\u0441\u0442\u044f \u0440\u0443\u043a\u0430\u0432\u0430, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u0440\u0447\u0435\u043d\u043d\u044b\u043c\u0438&#187; (\u0441) YaGPT 2. \u0412 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 &#8212; \u043d\u0435\u0432\u0435\u0440\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0439 \u0442\u0440\u0430\u0442\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432: \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <em>Pure.DI<\/em> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0436\u0438\u0437\u043d\u0438:<\/p>\n<ul>\n<li>\n<p><em>Transient<\/em> &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)<\/p>\n<\/li>\n<li>\n<p><em>Singleton<\/em> &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u0440\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><em>PerResolve<\/em> &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0432\u0441\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 &#8212; <em>PerResolve<\/em>. \u042d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 &#8212; &#171;<em>Singleton<\/em> \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u043a\u0430\u0445&#187;, \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/perresolve.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">interface IDependency;  class Dependency : IDependency;  class Service {   public Service(     IDependency dep1,     IDependency dep2,     Lazy&lt;(IDependency dep3, IDependency dep4)> deps)   {     Dep1 = dep1;     Dep2 = dep2;     Dep3 = deps.Value.dep3;     Dep4 = deps.Value.dep4;   }    public IDependency Dep1 { get; }    public IDependency Dep2 { get; }    public IDependency Dep3 { get; }      public IDependency Dep4 { get; } }  DI.Setup(nameof(Composition))   .Bind&lt;IDependency>().As(Lifetime.PerResolve).To&lt;Dependency>()   .Root&lt;Service>(\"Root\");  var composition = new Composition();  var service1 = composition.Root; service1.Dep1.ShouldBe(service1.Dep2); service1.Dep3.ShouldBe(service1.Dep4); service1.Dep1.ShouldBe(service1.Dep3);  var service2 = composition.Root; service2.Dep1.ShouldNotBe(service1.Dep1);<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c <em>service1<\/em>, \u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 <em>Dependency1<\/em>, <em>Dependency2, Dependency3, Dependency4<\/em> \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442. \u0414\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c <em>service2<\/em> \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 &#8212; \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cs\">partial class Composition {   public IService Root   {     var dependency = default(Dependency);     var funcDeps = new Func&lt;(IDependency dep3, IDependency dep4)>(     () =>     {       if (ReferenceEquals(dependency, null))       {         lock (_lock)         {           if (ReferenceEquals(dependency, null))           {             dependency = new Dependency();           }         }       }        return (dependency, dependency);     });          var lazyDeps = new Lazy&lt;(IDependency dep3, IDependency dep4)>(funcDeps, true);            if (ReferenceEquals(dependency, null))     {       lock (_lock)       {         if (ReferenceEquals(dependency, null))         {           dependency = new Dependency();         }       }     }          return new Service(dependency, dependency, lazyDeps);   } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043a\u043e\u0433\u0434\u0430 <em>PerResolve<\/em> \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <em>Dependency<\/em>, \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e \u0432 \u043b\u044f\u043c\u0431\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 <em>IEnumerable&lt;T>, Lazy&lt;T><\/em> \u0438 \u0442.\u0434. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0442\u0440\u0430\u0442\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435\u0441\u0442\u043a\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0440\u0435\u0437\u043c\u0435\u0440\u043d\u043e, \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0431\u0435\u0437 \u0444\u0430\u043d\u0430\u0442\u0438\u0437\u043c\u0430, \u0442.\u0435. \u0431\u0435\u0437 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0438\u0445 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;. \u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>PerBlock &#8212;<\/em> \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/perblock.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">DI.Setup(nameof(Composition))   \/\/ PerResolve -> PerBlock   .Bind&lt;IDependency>().As(Lifetime.PerBlock).To&lt;Dependency>()   .Root&lt;Service>(\"Root\");  var composition = new Composition();  var service1 = composition.Root; service1.Dep1.ShouldBe(service1.Dep2); service1.Dep3.ShouldBe(service1.Dep4); service1.Dep1.ShouldNotBe(service1.Dep3);  var service2 = composition.Root; service2.Dep1.ShouldNotBe(service1.Dep1);<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043d\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c <em>service1<\/em> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0434\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 <em>Dependency<\/em>:<\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0432\u044b\u0439 &#8212; \u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <em>Dependecy1<\/em> \u0438 <em>Dependecy2<\/em><\/p>\n<\/li>\n<li>\n<p>\u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a <em>deps, <\/em>\u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <em>Dependecy3<\/em> \u0438 <em>Dependecy4<\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">partial class Composition {   public Service Root   {     var funcDeps = new Func&lt;(IDependency dep3, IDependency dep4)>(     () =>     {         \/\/ \u0432\u0442\u043e\u0440\u043e\u0439         var dependency34 = new Dependency();         return (dependency34, dependency34);     });          var lazyDeps = new Lazy&lt;(IDependency dep3, IDependency dep4)>(funcDeps, true);      \/\/ \u043f\u0435\u0440\u0432\u044b\u0439     var dependency12 = new Dependency();     return new Service(dependency12, dependency12, lazyDeps);   } }<\/code><\/pre>\n<p>\u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c&#187; \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <em>Dependency<\/em> \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <em>PerBlock<\/em> \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438&#187;, \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>PerBlock<\/em> \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 <em>Pure.DI <\/em>\u0432\u0435\u0440\u0441\u0438\u0438 2.1 &#8212; \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>Scoped<\/em>. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/dependency-injection\" rel=\"noopener noreferrer nofollow\">Microsoft Dependency Injection<\/a> \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0436\u0438\u0437\u043d\u0438 <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/dependency-injection#scoped\" rel=\"noopener noreferrer nofollow\"><em>Scoped<\/em><\/a>:<\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c &#171;\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c&#187; \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 (\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 <em>Pure.DI<\/em> \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>Scoped<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0435, <a href=\"https:\/\/github.com\/DevTeam\/Pure.DI\/blob\/master\/readme\/scope.md\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<pre><code class=\"cs\">interface IDependency {   bool IsDisposed { get; } }  class Dependency : IDependency, IDisposable {   public bool IsDisposed { get; private set; }    public void Dispose() => IsDisposed = true; }  interface IService {   IDependency Dependency { get; } }  class Service(IDependency dependency) : IService {   public IDependency Dependency => dependency; }  \/\/ Implements a session class Session(Composition composition) : Composition(composition);  class Program(Func&lt;Session> sessionFactory) {   public Session CreateSession() => sessionFactory(); }  partial class Composition {   private static void Setup() =>     DI.Setup(nameof(Composition))       .Bind&lt;IDependency>().As(Scoped).To&lt;Dependency>()       .Bind&lt;IService>().To&lt;Service>()       \/\/ Session composition root       .Root&lt;IService>(\"SessionRoot\")       \/\/ Program composition root       .Root&lt;Program>(\"ProgramRoot\"); }  var composition = new Composition(); var program = composition.ProgramRoot;          \/\/ Creates session #1 var session1 = program.CreateSession(); var dependency1 = session1.SessionRoot.Dependency; var dependency12 = session1.SessionRoot.Dependency;          \/\/ Checks the identity of scoped instances in the same session dependency1.ShouldBe(dependency12);          \/\/ Creates session #2 var session2 = program.CreateSession(); var dependency2 = session2.SessionRoot.Dependency;          \/\/ Checks that the scoped instances are not identical in different sessions dependency1.ShouldNotBe(dependency2);          \/\/ Disposes of session #1 session1.Dispose(); \/\/ Checks that the scoped instance is finalized dependency1.IsDisposed.ShouldBeTrue();          \/\/ Disposes of session #2 session2.Dispose(); \/\/ Checks that the scoped instance is finalized dependency2.IsDisposed.ShouldBeTrue();<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 <em>session1<\/em> \u0438 <em>session2<\/em>. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <em>Dependency. <\/em>\u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0451 <em>Scoped <\/em>\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0438\u043f\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 &#8212; \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <em>Scoped<\/em>, \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #35<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0442\u0438\u043f (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e) \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0442\u0438\u043f <em>Session<\/em> \u0432 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043a\u043e\u0434\u0430 #24<\/p>\n<\/li>\n<li>\n<p>\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0439 \u043b\u0435\u043d\u0438\u0432\u043e, \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #26, \u0433\u0434\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0430 <em>Func&lt;Session><\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">partial class Composition: IDisposable {   private readonly Composition _root;   private readonly object _lock;   readonly IDisposable[] _disposables;   private int _disposeIndex;   private Dependency _scopedDependency;    public Composition()   {     _root = this;     _lock = new object();     _disposables = new IDisposable[1];   }    internal Composition(Composition baseComposition)   {     _root = baseComposition._root;     _lock = _root._lock;     _disposables = new IDisposable[1];   }    \/\/\/ &lt;summary>   \/\/\/ Program composition root   \/\/\/ &lt;\/summary>   public Program ProgramRoot   {     get     {       var sessionFactory = new Func&lt;Session>(() => new Session(this));       return new Program(sessionFactory);     }   }    \/\/\/ &lt;summary>   \/\/\/ Session composition root   \/\/\/ &lt;\/summary>   public IService SessionRoot   {     get     {       if (ReferenceEquals(_scopedDependency, null))       {         lock (_lock)         {           if (ReferenceEquals(_scopedDependency, null))           {             _scopedDependency = new Dependency();             _disposables[_disposeIndex++] = _scopedDependency;           }         }               }              return new Service(_scopedDependency);     }   }    public void Dispose()   {     lock (_lock)     {       while (_disposeIndex > 0)       {         var disposableInstance = _disposables[--_disposeIndex];         try         {           disposableInstance.Dispose();         }         catch(Exception exception)         {           OnDisposeException(disposableInstance, exception);         }       }              _scopedDependency = null;     }   } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 #16. \u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430 <em>Dispose() \u0434\u043b\u044f \u0441\u0435\u0441\u0441\u0438\u0438<\/em>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435,<\/p>\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-369067","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369067","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=369067"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369067\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=369067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=369067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=369067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}