<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Web on LeafCxy's Blog</title><link>https://leafcxy.github.io/tags/web/</link><description>Recent content in Web on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 28 Jul 2025 00:32:15 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/tags/web/index.xml" rel="self" type="application/rss+xml"/><item><title>IoC和DI</title><link>https://leafcxy.github.io/posts/2025-07-28-4/</link><pubDate>Mon, 28 Jul 2025 00:32:15 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-28-4/</guid><description>&lt;p&gt;解释一下IoC和DI的概念：&lt;/p&gt;
&lt;h2 id="ioc-inversion-of-control---控制反转"&gt;IoC (Inversion of Control) - 控制反转&lt;/h2&gt;
&lt;p&gt;控制反转是一种软件设计原则，它将传统的程序控制流程颠倒过来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统方式&lt;/strong&gt;：对象自己创建和管理依赖项&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IoC方式&lt;/strong&gt;：对象的依赖项由外部容器或框架来创建和注入&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="di-dependency-injection---依赖注入"&gt;DI (Dependency Injection) - 依赖注入&lt;/h2&gt;
&lt;p&gt;依赖注入是实现IoC的一种具体方式，通过以下方式实现：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;构造函数注入&lt;/strong&gt;：通过构造函数传入依赖项&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性注入&lt;/strong&gt;：通过属性设置依赖项&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法注入&lt;/strong&gt;：通过方法参数传入依赖项&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- more --&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Linq;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IContainer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Register&amp;lt;TService, TImplementation&amp;gt;() &lt;span style="color:#66d9ef"&gt;where&lt;/span&gt; TImplementation : TService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Register&amp;lt;TService&amp;gt;(Func&amp;lt;TService&amp;gt; instanceCreator);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TService Resolve&amp;lt;TService&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Container&lt;/span&gt; : IContainer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Dictionary&amp;lt;Type, Func&amp;lt;&lt;span style="color:#66d9ef"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; _registry = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Dictionary&amp;lt;Type, Func&amp;lt;&lt;span style="color:#66d9ef"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Register&amp;lt;TService, TImplementation&amp;gt;() &lt;span style="color:#66d9ef"&gt;where&lt;/span&gt; TImplementation : TService
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _registry[&lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt;(TService)] = () =&amp;gt; Activator.CreateInstance(&lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt;(TImplementation));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Register&amp;lt;TService&amp;gt;(Func&amp;lt;TService&amp;gt; instanceCreator)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _registry[&lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt;(TService)] = () =&amp;gt; instanceCreator();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; TService Resolve&amp;lt;TService&amp;gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Func&amp;lt;&lt;span style="color:#66d9ef"&gt;object&lt;/span&gt;&amp;gt; creator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_registry.TryGetValue(&lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt;(TService), &lt;span style="color:#66d9ef"&gt;out&lt;/span&gt; creator))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (TService)creator();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Exception(&lt;span style="color:#e6db74"&gt;$&amp;#34;No registration for {typeof(TService)}&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>