湘衡 發表於 2020-5-8 17:04:00

C# Autofac学习笔记

<h2>&nbsp; &nbsp; 一、为什么使用Autofac?</h2>
<p>&nbsp; &nbsp; Autofac是.NET领域最为流行的IoC框架之一,传说是速度最快的一个。</p>
<h4>&nbsp; &nbsp; 1.1、性能</h4>
<p>&nbsp; &nbsp; 有人专门做了测试:</p>
<p><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508104804509-518142365.png" alt=""><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508104221310-186725511.png" alt=""></p>
<h4>&nbsp; &nbsp; 1.2、优点</h4>
<p>&nbsp; &nbsp; 1)与C#语言联系很紧密。C#里的很多编程方式都可以为Autofac使用,例如可以使用Lambda表达式注册组件。</p>
<p>&nbsp; &nbsp; 2)较低的学习曲线。学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们。</p>
<p>&nbsp; &nbsp; 3)支持JSON/XML配置。</p>
<p>&nbsp; &nbsp; 4)自动装配。</p>
<p>&nbsp; &nbsp; 5)与Asp.Net MVC集成。</p>
<p>&nbsp; &nbsp; 6)微软的Orchad开源程序使用的就是Autofac,可以看出它的方便和强大。</p>
<h4>&nbsp; &nbsp; 1.3、资源</h4>
<p>&nbsp; &nbsp; 官方网站:http://autofac.org/</p>
<p>&nbsp; &nbsp; GitHub网址:https://github.com/autofac/Autofac</p>
<p>&nbsp; &nbsp; 学习资料:Autofac中文文档</p>
<h2>&nbsp; &nbsp; 二、数据准备</h2>
<h4>&nbsp; &nbsp; 2.1、新建项目</h4>
<p><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508164204391-1223728885.png" alt=""></p>
<p>&nbsp; &nbsp; IService下的接口类:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_d517d2e3-82d0-456f-9728-046e65746a9c" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_d517d2e3-82d0-456f-9728-046e65746a9c" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_d517d2e3-82d0-456f-9728-046e65746a9c" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 动物吠声接口类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IAnimalBark
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 吠叫
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Bark();
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">IAnimalBark</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_4ae9a183-5865-4c69-b7f5-7c335245805e" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_4ae9a183-5865-4c69-b7f5-7c335245805e" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_4ae9a183-5865-4c69-b7f5-7c335245805e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 动物睡眠接口类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IAnimalSleep
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 睡眠
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Sleep();
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">IAnimalSleep</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_5990d505-2282-4700-8a92-fbd44f181f57" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_5990d505-2282-4700-8a92-fbd44f181f57" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_5990d505-2282-4700-8a92-fbd44f181f57" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 学校接口类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> ISchool
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 放学
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> LeaveSchool();
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">ISchool</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_1bc01a92-b59d-4ea6-b2fd-1f8970a8d579" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_1bc01a92-b59d-4ea6-b2fd-1f8970a8d579" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_1bc01a92-b59d-4ea6-b2fd-1f8970a8d579" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 学生接口类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IStudent
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 增加学生
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="studentID"&gt;</span><span style="color: rgba(0, 128, 0, 1)">学生ID</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="studentName"&gt;</span><span style="color: rgba(0, 128, 0, 1)">学生姓名</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> Add(<span style="color: rgba(0, 0, 255, 1)">string</span> studentID, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> studentName);
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">IStudent</span></div>
<p>&nbsp; &nbsp; Service下的接口实现类:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_60843312-f159-4f6a-ba89-577f89d86fb5" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_60843312-f159-4f6a-ba89-577f89d86fb5" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_60843312-f159-4f6a-ba89-577f89d86fb5" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Service
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 猫类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Cat : IAnimalSleep
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 睡眠
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Sleep()
      {
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小猫咪睡着了zZ</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">Cat</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_e0db6580-6dc2-476f-8875-b8e4ec5d25f2" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_e0db6580-6dc2-476f-8875-b8e4ec5d25f2" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_e0db6580-6dc2-476f-8875-b8e4ec5d25f2" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Service
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 狗类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Dog : IAnimalBark, IAnimalSleep
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 吠叫
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Bark()
      {
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">汪汪汪</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 睡眠
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Sleep()
      {
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小狗狗睡着了zZ</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">Dog</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_270bf833-c17a-479f-b4bf-84ac6c966336" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_270bf833-c17a-479f-b4bf-84ac6c966336" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_270bf833-c17a-479f-b4bf-84ac6c966336" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Service
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 学校类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> School : ISchool
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> IAnimalBark属性
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> IAnimalBark AnimalBark { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 放学
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> LeaveSchool()
      {
            AnimalBark.Bark();
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你家的熊孩子放学了⊙o⊙</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">School</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_845bc7ae-21da-4a10-a226-08fc35347bbe" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_845bc7ae-21da-4a10-a226-08fc35347bbe" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_845bc7ae-21da-4a10-a226-08fc35347bbe" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Service
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 学生类
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Student : IStudent
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 无参构造函数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Student()
      { }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 有参构造函数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="studentID"&gt;</span><span style="color: rgba(0, 128, 0, 1)">学生ID</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="studentName"&gt;</span><span style="color: rgba(0, 128, 0, 1)">学生姓名</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> Student(<span style="color: rgba(0, 0, 255, 1)">string</span> studentID, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> studentName)
      {
            Add(studentID, studentName);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 增加学生
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="studentID"&gt;</span><span style="color: rgba(0, 128, 0, 1)">学生ID</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="studentName"&gt;</span><span style="color: rgba(0, 128, 0, 1)">学生姓名</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Add(<span style="color: rgba(0, 0, 255, 1)">string</span> studentID, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> studentName)
      {
            Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">新增的学生是:{studentName}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">Student</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_81104836-65db-4036-8d46-98cd57b90fc4" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_81104836-65db-4036-8d46-98cd57b90fc4" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_81104836-65db-4036-8d46-98cd57b90fc4" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.IService;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Service
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 动物摇尾巴
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> AnimalWagging
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> IAnimalBark属性
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      IAnimalBark animalBark;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 有参构造函数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="bark"&gt;</span><span style="color: rgba(0, 128, 0, 1)">IAnimalBark变量</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> AnimalWagging(IAnimalBark bark)
      {
            animalBark </span>=<span style="color: rgba(0, 0, 0, 1)"> bark;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 摇尾巴
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">virtual</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Wagging()
      {
            animalBark.Bark();
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">摇尾巴</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 计数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> Count()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 任务
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="name"&gt;</span><span style="color: rgba(0, 128, 0, 1)">动物名称</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">virtual</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; WaggingAsync(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> name)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> result = <span style="color: rgba(0, 0, 255, 1)">await</span> Task.Run(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> Count());
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> $<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{name}摇了{result}下尾巴</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">AnimalWagging</span></div>
<h4>&nbsp; &nbsp; 2.2、Autofac安装</h4>
<p>&nbsp; &nbsp; Client项目右键-&gt;管理 NuGet 程序包-&gt;Autofac。</p>
<p><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508113758896-1545524391.png" alt=""></p>
<h2>&nbsp; &nbsp; 三、IoC-注册</h2>
<h4>&nbsp; &nbsp; 3.1、类型注册</h4>
<p>&nbsp; &nbsp; a)类型注册:使用RegisterType进行注册。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_ffed5b7f-caf2-435c-891e-0b2418045739" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_ffed5b7f-caf2-435c-891e-0b2418045739" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_ffed5b7f-caf2-435c-891e-0b2418045739" class="cnblogs_code_hide">
<pre>            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册Autofac组件</span>
            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册实现类Student,当我们请求IStudent接口的时候,返回的是类Student的对象。</span>
            builder.RegisterType&lt;Student&gt;().As&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上面这句也可改成下面这句,这样请求Student实现了的任何接口的时候,都会返回Student对象。
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">builder.RegisterType&lt;Student&gt;().AsImplementedInterfaces();</span>
            IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">请求IStudent接口</span>
            IStudent student = container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1001</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp; &nbsp; b)类型注册(别名):假如一个接口有多个实现类,可以在注册时起别名。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_f144d5f8-6c85-4ed2-8bf9-e2cd026fa54f" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_f144d5f8-6c85-4ed2-8bf9-e2cd026fa54f" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_f144d5f8-6c85-4ed2-8bf9-e2cd026fa54f" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterType</span>&lt;Dog&gt;().Named&lt;IAnimalSleep&gt;(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Dog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            builder.RegisterType</span>&lt;Cat&gt;().Named&lt;IAnimalSleep&gt;(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cat</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dog = container.ResolveNamed&lt;IAnimalSleep&gt;(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Dog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            dog.Sleep();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> cat = container.ResolveNamed&lt;IAnimalSleep&gt;(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cat</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            cat.Sleep();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp; &nbsp; c)类型注册(枚举):假如一个接口有多个实现类,也可以使用枚举的方式注册。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_aaca75dd-2514-44b4-81b8-c5ab4e20d4ae" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_aaca75dd-2514-44b4-81b8-c5ab4e20d4ae" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_aaca75dd-2514-44b4-81b8-c5ab4e20d4ae" class="cnblogs_code_hide">
<pre>      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">enum</span><span style="color: rgba(0, 0, 0, 1)"> AnimalType
      {
            Dog,
            Cat
      }</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_3fc208f7-ccd1-4939-adca-e7619cd25fac" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_3fc208f7-ccd1-4939-adca-e7619cd25fac" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_3fc208f7-ccd1-4939-adca-e7619cd25fac" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterType</span>&lt;Dog&gt;().Keyed&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">(AnimalType.Dog);
            builder.RegisterType</span>&lt;Cat&gt;().Keyed&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">(AnimalType.Cat);
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dog = container.ResolveKeyed&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">(AnimalType.Dog);
            dog.Sleep();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> cat = container.ResolveKeyed&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">(AnimalType.Cat);
            cat.Sleep();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 3.2、实例注册</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_e8010e0a-761c-4de5-b9ce-a858f202a6d1" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_e8010e0a-761c-4de5-b9ce-a858f202a6d1" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_e8010e0a-761c-4de5-b9ce-a858f202a6d1" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterInstance</span>&lt;IStudent&gt;(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Student());
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            IStudent student </span>= container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1001</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 3.3、Lambda注册</h4>
<p>&nbsp; &nbsp; a)Lambda注册</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_9da2d712-e276-4625-b396-069f1b7371b5" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_9da2d712-e276-4625-b396-069f1b7371b5" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_9da2d712-e276-4625-b396-069f1b7371b5" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.Register(c </span>=&gt; <span style="color: rgba(0, 0, 255, 1)">new</span> Student()).As&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            IStudent student </span>= container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1001</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp; &nbsp; b)Lambda注册(NamedParameter)</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_204f41b0-dee1-49a0-a24e-daa3bfc70845" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_204f41b0-dee1-49a0-a24e-daa3bfc70845" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_204f41b0-dee1-49a0-a24e-daa3bfc70845" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.Register</span>&lt;IAnimalSleep&gt;((c, p) =&gt;<span style="color: rgba(0, 0, 0, 1)">
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">var</span> type = p.Named&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (type == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Dog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Dog();
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Cat();
                  }
                }).As</span>&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">();
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dog = container.Resolve&lt;IAnimalSleep&gt;(<span style="color: rgba(0, 0, 255, 1)">new</span> NamedParameter(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Dog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
            dog.Sleep();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 3.4、程序集注册</h4>
<p>&nbsp; &nbsp;&nbsp;如果有很多接口及实现类,假如觉得这种一一注册很麻烦的话,可以一次性全部注册,当然也可以加筛选条件。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_e5749b09-ad92-4497-9a98-42c5fa67e514" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_e5749b09-ad92-4497-9a98-42c5fa67e514" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_e5749b09-ad92-4497-9a98-42c5fa67e514" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            Assembly assembly </span>= Assembly.Load(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LinkTo.Test.Autofac.Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现类所在的程序集名称</span>
            builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">常用
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">builder.RegisterAssemblyTypes(assembly).Where(t=&gt;t.Name.StartsWith("S")).AsImplementedInterfaces();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">带筛选
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">builder.RegisterAssemblyTypes(assembly).Except&lt;School&gt;().AsImplementedInterfaces();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">带筛选</span>
            IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">单实现类的用法</span>
            IStudent student = container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1001</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">多实现类的用法</span>
            IEnumerable&lt;IAnimalSleep&gt; animals = container.Resolve&lt;IEnumerable&lt;IAnimalSleep&gt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> animals)
            {
                item.Sleep();
            }</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 3.5、泛型注册</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_5cec18d3-62cf-4f09-964b-ee7cd1d331b2" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_5cec18d3-62cf-4f09-964b-ee7cd1d331b2" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_5cec18d3-62cf-4f09-964b-ee7cd1d331b2" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterGeneric(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span>(List&lt;&gt;)).As(<span style="color: rgba(0, 0, 255, 1)">typeof</span>(IList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">));
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            IList</span>&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; list = container.Resolve&lt;IList&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;&gt;();</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 3.6、默认注册</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_61f3cfc4-abbc-47d7-b7a6-ec260dbbf5aa" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_61f3cfc4-abbc-47d7-b7a6-ec260dbbf5aa" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_61f3cfc4-abbc-47d7-b7a6-ec260dbbf5aa" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对于同一个接口,后面注册的实现会覆盖之前的实现。
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果不想覆盖的话,可以用PreserveExistingDefaults,这样会保留原来注册的实现。</span>
            builder.RegisterType&lt;Dog&gt;().As&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">();
            builder.RegisterType</span>&lt;Cat&gt;().As&lt;IAnimalSleep&gt;().PreserveExistingDefaults();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">指定为非默认值</span>
            IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dog = container.Resolve&lt;IAnimalSleep&gt;<span style="color: rgba(0, 0, 0, 1)">();
            dog.Sleep();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>&nbsp; &nbsp; 四、IoC-注入</h2>
<h4>&nbsp; &nbsp; 4.1、构造函数注入</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_b5656299-e690-41d8-8f76-406c6eb9bc22" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_b5656299-e690-41d8-8f76-406c6eb9bc22" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b5656299-e690-41d8-8f76-406c6eb9bc22" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterType</span>&lt;AnimalWagging&gt;<span style="color: rgba(0, 0, 0, 1)">();
            builder.RegisterType</span>&lt;Dog&gt;().As&lt;IAnimalBark&gt;<span style="color: rgba(0, 0, 0, 1)">();
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            AnimalWagging animal </span>= container.Resolve&lt;AnimalWagging&gt;<span style="color: rgba(0, 0, 0, 1)">();
            animal.Wagging();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 4.2、属性注入</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_7eafd6a6-0a58-43b1-824d-2fc36155ae83" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_7eafd6a6-0a58-43b1-824d-2fc36155ae83" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_7eafd6a6-0a58-43b1-824d-2fc36155ae83" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            Assembly assembly </span>= Assembly.Load(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LinkTo.Test.Autofac.Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>);                           <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现类所在的程序集名称</span>
            builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces().PropertiesAutowired();    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">常用</span>
            IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            ISchool school </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            school.LeaveSchool();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>&nbsp; &nbsp; 五、IoC-事件</h2>
<p>&nbsp; &nbsp; Autofac在组件生命周期的不同阶段,共对应了5个事件,执行顺序如下所示:</p>
<p>&nbsp; &nbsp; 1.OnRegistered-&gt;2.OnPreparing-&gt;3.OnActivating-&gt;4.OnActivated-&gt;5.OnRelease</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_7a276f25-b91d-4c9b-9626-8b8de4069fd3" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_7a276f25-b91d-4c9b-9626-8b8de4069fd3" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_7a276f25-b91d-4c9b-9626-8b8de4069fd3" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterType</span>&lt;Student&gt;().As&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">()
                .OnRegistered(e </span>=&gt; Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OnRegistered:在注册的时候调用</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
                .OnPreparing(e </span>=&gt; Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OnPreparing:在准备创建的时候调用</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
                .OnActivating(e </span>=&gt; Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OnActivating:在创建之前调用</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.OnActivating(e =&gt; e.ReplaceInstance(new Student("1000", "Test")))</span>
                .OnActivated(e =&gt; Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OnActivated:在创建之后调用</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">))
                .OnRelease(e </span>=&gt; Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OnRelease:在释放占用的资源之前调用</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
            </span><span style="color: rgba(0, 0, 255, 1)">using</span> (IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build())
            {
                IStudent student </span>= container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
                student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1001</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            }</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>&nbsp; &nbsp; 六、IoC-生命周期</h2>
<h4>&nbsp; &nbsp; 6.1、Per Dependency</h4>
<p>&nbsp; &nbsp; Per Dependency:为默认的生命周期,也被称为"transient"或"factory",其实就是每次请求都创建一个新的对象。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_c8c74c87-ed8c-47c8-8dfd-d5c320c2d577" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_c8c74c87-ed8c-47c8-8dfd-d5c320c2d577" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_c8c74c87-ed8c-47c8-8dfd-d5c320c2d577" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            Assembly assembly </span>= Assembly.Load(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LinkTo.Test.Autofac.Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>);                                                   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现类所在的程序集名称</span>
            builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces().PropertiesAutowired().InstancePerDependency();    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">常用</span>
            IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            ISchool school1 </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            ISchool school2 </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            Console.WriteLine(school1.Equals(school2));</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 6.2、Single Instance</h4>
<p>&nbsp; &nbsp;&nbsp;Single Instance:就是每次都用同一个对象。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_7187525c-9141-40e8-b23a-e87f6003064a" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_7187525c-9141-40e8-b23a-e87f6003064a" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_7187525c-9141-40e8-b23a-e87f6003064a" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            Assembly assembly </span>= Assembly.Load(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LinkTo.Test.Autofac.Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>);                                           <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现类所在的程序集名称</span>
            builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces().PropertiesAutowired().SingleInstance();   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">常用</span>
            IContainer container =<span style="color: rgba(0, 0, 0, 1)"> builder.Build();

            ISchool school1 </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            ISchool school2 </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            Console.WriteLine(ReferenceEquals(school1, school2));</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 6.3、Per Lifetime Scope</h4>
<p>&nbsp; &nbsp; Per Lifetime Scope:同一个Lifetime生成的对象是同一个实例。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_66c65942-5124-471a-b1f5-2ec02b296fe2" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_66c65942-5124-471a-b1f5-2ec02b296fe2" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_66c65942-5124-471a-b1f5-2ec02b296fe2" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            builder.RegisterType</span>&lt;School&gt;().As&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">().InstancePerLifetimeScope();
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();
            ISchool school1 </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            ISchool school2 </span>= container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            Console.WriteLine(school1.Equals(school2));
            </span><span style="color: rgba(0, 0, 255, 1)">using</span> (ILifetimeScope lifetime =<span style="color: rgba(0, 0, 0, 1)"> container.BeginLifetimeScope())
            {
                ISchool school3 </span>= lifetime.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
                ISchool school4 </span>= lifetime.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
                Console.WriteLine(school3.Equals(school4));
                Console.WriteLine(school2.Equals(school3));
            }</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>&nbsp; &nbsp; 七、IoC-通过配置文件使用Autofac</h2>
<h4>&nbsp; &nbsp; 7.1、组件安装</h4>
<p>&nbsp; &nbsp;&nbsp;Client项目右键-&gt;管理 NuGet 程序包-&gt;Autofac.Configuration及Microsoft.Extensions.Configuration.Xml。</p>
<p><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508162013314-489495231.png" alt=""></p>
<p><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508162055600-2139623364.png" alt=""></p>
<h4>&nbsp; &nbsp; 7.2、配置文件</h4>
<p>&nbsp; &nbsp; 新建一个AutofacConfigIoC.xml文件,在其属性的复制到输出目录项下选择始终复制。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_f5619460-db96-49d1-8a45-20f25c492050" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_f5619460-db96-49d1-8a45-20f25c492050" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_f5619460-db96-49d1-8a45-20f25c492050" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">xml version="1.0" encoding="utf-8" </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">autofac </span><span style="color: rgba(255, 0, 0, 1)">defaultAssembly</span><span style="color: rgba(0, 0, 255, 1)">="LinkTo.Test.Autofac.IService"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">无注入</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">components </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="1001"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>LinkTo.Test.Autofac.Service.Student, LinkTo.Test.Autofac.Service<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">services </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="0"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="LinkTo.Test.Autofac.IService.IStudent"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>true<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">components</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">components </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="1002"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>LinkTo.Test.Autofac.Service.Dog, LinkTo.Test.Autofac.Service<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">services </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="0"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="LinkTo.Test.Autofac.IService.IAnimalBark"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>true<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">components</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">构造函数注入</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">components </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="2001"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>LinkTo.Test.Autofac.Service.AnimalWagging, LinkTo.Test.Autofac.Service<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">services </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="0"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="LinkTo.Test.Autofac.Service.AnimalWagging, LinkTo.Test.Autofac.Service"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>true<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">components</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">属性注入</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">components </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="3001"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>LinkTo.Test.Autofac.Service.School, LinkTo.Test.Autofac.Service<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">services </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="0"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="LinkTo.Test.Autofac.IService.ISchool"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>true<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">injectProperties</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">components</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">autofac</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h4>&nbsp; &nbsp; 7.3、测试代码</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_3b496837-dbfa-49e9-9150-293efd80713e" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_3b496837-dbfa-49e9-9150-293efd80713e" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_3b496837-dbfa-49e9-9150-293efd80713e" class="cnblogs_code_hide">
<pre>            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加载配置</span>
            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> config = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConfigurationBuilder();
            config.AddXmlFile(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">AutofacConfigIoC.xml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> module = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConfigurationModule(config.Build());
            builder.RegisterModule(module);
            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">无注入测试</span>
            IStudent student = container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1002</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">World</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造函数注入测试</span>
            AnimalWagging animal = container.Resolve&lt;AnimalWagging&gt;<span style="color: rgba(0, 0, 0, 1)">();
            animal.Wagging();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">属性注入测试</span>
            ISchool school = container.Resolve&lt;ISchool&gt;<span style="color: rgba(0, 0, 0, 1)">();
            school.LeaveSchool();</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>&nbsp; &nbsp; 八、AOP&nbsp;</h2>
<h4>&nbsp; &nbsp; 8.1、组件安装</h4>
<p>&nbsp; &nbsp;&nbsp;Client项目右键-&gt;管理 NuGet 程序包-&gt;Autofac.Extras.DynamicProxy。</p>
<p><img src="https://img2020.cnblogs.com/blog/1227623/202005/1227623-20200508163019244-464968566.png" alt=""></p>
<h4>&nbsp; &nbsp; 8.2、拦截器</h4>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_b6751152-5462-48a3-8656-f0e4b683efef" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_b6751152-5462-48a3-8656-f0e4b683efef" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b6751152-5462-48a3-8656-f0e4b683efef" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.IO;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Reflection;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Castle.DynamicProxy;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Client
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 拦截器:需实现IInterceptor接口。
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> CallLogger : IInterceptor
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> TextWriter _output;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> CallLogger(TextWriter output)
      {
            _output </span>=<span style="color: rgba(0, 0, 0, 1)"> output;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 拦截方法:打印被拦截的方法--执行前的名称、参数以及执行后的返回结果。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="invocation"&gt;</span><span style="color: rgba(0, 128, 0, 1)">被拦截方法的信息</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Intercept(IInvocation invocation)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">空白行</span>
<span style="color: rgba(0, 0, 0, 1)">            _output.WriteLine();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在下一个拦截器或目标方法处理之前的处理</span>
            _output.WriteLine($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">调用方法:{invocation.Method.Name}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (invocation.Arguments.Length &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                _output.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">参数:{string.Join(</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">, invocation.Arguments.Select(a =&gt; (a ?? </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(128, 0, 0, 1)">).ToString()).ToArray())}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            }

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用下一个拦截器(若存在),直到最终的目标方法(Target Method)。</span>
<span style="color: rgba(0, 0, 0, 1)">            invocation.Proceed();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取被代理方法的返回类型</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> returnType =<span style="color: rgba(0, 0, 0, 1)"> invocation.Method.ReturnType;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">异步方法</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (IsAsyncMethod(invocation.Method))
            {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Task:返回值是固定类型</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (returnType != <span style="color: rgba(0, 0, 255, 1)">null</span> &amp;&amp; returnType == <span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(Task))
                {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个异步方法来等待目标方法返回的Task</span>
                  <span style="color: rgba(0, 0, 255, 1)">async</span> Task Continuation() =&gt; <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> (Task)invocation.ReturnValue;
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Continuation()中并没有使用await,所以Continuation()就如同步方法一样是阻塞的。</span>
                  invocation.ReturnValue =<span style="color: rgba(0, 0, 0, 1)"> Continuation();
                }
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Task&lt;T&gt;:返回值是泛型类型</span>
                <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取被代理方法的返回类型</span>
                  <span style="color: rgba(0, 0, 255, 1)">var</span> returnTypeT =<span style="color: rgba(0, 0, 0, 1)"> invocation.Method.ReflectedType;
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (returnTypeT != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                  {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取泛型参数集合,集合中的第一个元素等价于typeof(Class)。</span>
                        <span style="color: rgba(0, 0, 255, 1)">var</span> resultType = invocation.Method.ReturnType.GetGenericArguments()[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">利用反射获得等待返回值的异步方法</span>
                        MethodInfo methodInfo = <span style="color: rgba(0, 0, 255, 1)">typeof</span>(CallLogger).GetMethod(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">HandleAsync</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BindingFlags.Public |<span style="color: rgba(0, 0, 0, 1)"> BindingFlags.Instance);
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用methodInfo类的MakeGenericMethod()方法,用获得的类型T(&lt;resultType&gt;)来重新构造HandleAsync()方法。</span>
                        <span style="color: rgba(0, 0, 255, 1)">var</span> mi =<span style="color: rgba(0, 0, 0, 1)"> methodInfo.MakeGenericMethod(resultType);
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Invoke:使用指定参数调用由当前实例表示的方法或构造函数。</span>
                        invocation.ReturnValue = mi.Invoke(<span style="color: rgba(0, 0, 255, 1)">this</span>, <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)">[] { invocation.ReturnValue });
                  }
                }

                </span><span style="color: rgba(0, 0, 255, 1)">var</span> type =<span style="color: rgba(0, 0, 0, 1)"> invocation.Method.ReturnType;
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> resultProperty = type.GetProperty(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Result</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (resultProperty != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                  _output.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">方法结果:{resultProperty.GetValue(invocation.ReturnValue)}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">同步方法</span>
            <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (returnType != <span style="color: rgba(0, 0, 255, 1)">null</span> &amp;&amp; returnType != <span style="color: rgba(0, 0, 255, 1)">typeof</span>(<span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)">))
                  _output.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">方法结果:{invocation.ReturnValue}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 判断是否异步方法
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)"> IsAsyncMethod(MethodInfo method)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
                (
                  method.ReturnType </span>== <span style="color: rgba(0, 0, 255, 1)">typeof</span>(Task) ||<span style="color: rgba(0, 0, 0, 1)">
                  (method.ReturnType.IsGenericType </span>&amp;&amp; method.ReturnType.GetGenericTypeDefinition() == <span style="color: rgba(0, 0, 255, 1)">typeof</span>(Task&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">))
                );
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 构造等待返回值的异步方法
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="task"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;T&gt; HandleAsync&lt;T&gt;(Task&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> task)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> t = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> task;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> t;
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">CallLogger</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_a581f659-eeb7-42bb-885a-ff138ce0eaa1" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_a581f659-eeb7-42bb-885a-ff138ce0eaa1" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_a581f659-eeb7-42bb-885a-ff138ce0eaa1" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Castle.DynamicProxy;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> LinkTo.Test.Autofac.Client
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> CallTester: IInterceptor
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Intercept(IInvocation invocation)
      {
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">啥也不干</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            invocation.Proceed();
            Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">也不干啥</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">CallTester</span></div>
<h4>&nbsp; &nbsp; 8.3、测试代码</h4>
<p>&nbsp; &nbsp; 注意:对于以类方式的注入,Autofac Interceptor要求类的方法必须为virtual方法。如AnimalWagging类的Wagging()、WaggingAsync(string name)都加了virtual修饰符。</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_6ac89e60-7c0e-468d-b290-cfed2c979729" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_6ac89e60-7c0e-468d-b290-cfed2c979729" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_6ac89e60-7c0e-468d-b290-cfed2c979729" class="cnblogs_code_hide">
<pre>            ContainerBuilder builder = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ContainerBuilder();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册拦截器</span>
            builder.Register(c =&gt; <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CallLogger(Console.Out));
            builder.Register(c </span>=&gt; <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CallTester());

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">动态注入拦截器

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这里定义了两个拦截器,注意它们的顺序。</span>
            builder.RegisterType&lt;Student&gt;().As&lt;IStudent&gt;().InterceptedBy(<span style="color: rgba(0, 0, 255, 1)">typeof</span>(CallLogger), <span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(CallTester)).EnableInterfaceInterceptors();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这里定义了一个拦截器</span>
            builder.RegisterType&lt;AnimalWagging&gt;().InterceptedBy(<span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(CallLogger)).EnableClassInterceptors();
            builder.RegisterType</span>&lt;Dog&gt;().As&lt;IAnimalBark&gt;<span style="color: rgba(0, 0, 0, 1)">();

            IContainer container </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.Build();
            IStudent student </span>= container.Resolve&lt;IStudent&gt;<span style="color: rgba(0, 0, 0, 1)">();
            student.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1003</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Kobe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

            AnimalWagging animal </span>= container.Resolve&lt;AnimalWagging&gt;<span style="color: rgba(0, 0, 0, 1)">();
            animal.Wagging();

            Task</span>&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; task = animal.WaggingAsync(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">哈士奇</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{task.Result}</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; IoC参考自:</p>
<p>&nbsp; &nbsp;&nbsp;https://www.xin3721.com/ArticlecSharp/c14013.html</p>
<p>&nbsp; &nbsp;&nbsp;https://www.cnblogs.com/GoogleGetZ/p/10218721.html</p>
<p>&nbsp; &nbsp;&nbsp;http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/</p>
<p>&nbsp; &nbsp;&nbsp;https://www.cnblogs.com/kissdodog/p/3611799.html</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; AOP参考自:</p>
<p>&nbsp; &nbsp;&nbsp;https://www.cnblogs.com/stulzq/p/6880394.html</p>
<p>&nbsp; &nbsp;&nbsp;https://blog.csdn.net/weixin_38211198/article/details/105925821</p>
<p>&nbsp; &nbsp;&nbsp;https://blog.csdn.net/q932104843/article/details/97611912</p><br><br>
来源:https://www.cnblogs.com/atomy/p/12834804.html
頁: [1]
查看完整版本: C# Autofac学习笔记