C# · 12月 21, 2021

[IOC]Unity使用

Unity是什么?<p style="margin-left: 30px;">unity是patterns&practices团队开发的一个轻量级、可扩展的依赖注入容器。

Unity特性<p style="margin-left: 30px;">1、它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。

<p style="margin-left: 30px;">2、Unity允许将预先配置的对象注入到类中,实现了inversion of control(Ioc)的功能。在Unity中,支持constructor injection(构造器注入),property setter injection(属性设置值注入)和method call injection(方法注入)。

<p style="margin-left: 30px;">3、支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。

<p style="margin-left: 30px;">4、可以通过配置文件进行准备和配置容器。

<p style="margin-left: 30px;">5、不会影响到类的定义(属性设置值注入和方法注入除外),这也是轻量级容器的一个体现。

<p style="margin-left: 30px;">6、支持自定义的容器扩展。

Unity实践<p style="margin-left: 30px;">新建一个控制台程序,Nuget安装Unity

<p style="margin-left: 30px;">

<p style="margin-left: 30px;">新建一个叫IFlyable 飞行能力的接口。

<p style="margin-left: 30px;">一个飞禽类,并实现飞行的接口

<p style="margin-left: 30px;">在Main方法中,通过Unity容器实例化一个飞禽对象,并让它飞。

Main(= container.RegisterType= container.Resolve }</span></pre><p style="margin-left: 30px;">输出

<p style="margin-left: 30px;">

<p style="margin-left: 30px;"> 如果多个实现类呢?

<p style="margin-left: 30px;">添加个飞机类,让其实现飞行接口

<p style="margin-left: 30px;">main方法

Main(= container.RegisterType= container.Resolve= container.Resolve }</span></pre><p style="margin-left: 30px;">结果

<p style="margin-left: 30px;">

<p style="margin-left: 30px;">Unity:在一个接口有多个实现的情况下,如果没有进行别名区分,会选择最后注入的实现。

<p style="margin-left: 30px;">加入别名

Main(= container.RegisterType((= container.Resolve(= container.Resolve( }</span></pre><p style="margin-left: 30px;">结果

<p style="margin-left: 30px;">

<p style="margin-left: 30px;">注意

<p style="margin-left: 30px;">当一个接口有多个实现类的时候,注入的时候需要通过别名进行区分。

<p style="margin-left: 30px;">构造函数注入

<p style="margin-left: 30px;">我们添加一个接口

; <p style="margin-left: 30px;">添加一个鹦鹉类,有飞行能力,并且会叫

.Fly = </span><span style=”color: #0000ff;”&gt;public</span> <span style=”color: #0000ff;”&gt;void</span><span style=”color: #000000;”&gt; Say() { Console.WriteLine(</span><span style=”color: #800000;”&gt;”</span><span style=”color: #800000;”&gt;会叫….</span><span style=”color: #800000;”&gt;”</span><span style=”color: #000000;”&gt;); }}</span></pre><p style="margin-left: 30px;">main方法中,注入

Main(= container.RegisterType= container.Resolve }</span></pre><p style="margin-left: 30px;">结果

<p style="margin-left: 30px;">

<p style="margin-left: 30px;">属性注入

<p style="margin-left: 30px;">通过在属性上面添加[Dependency]特性,即可注入。

<p style="margin-left: 30px;">Main方法与上面的相同。

<p style="margin-left: 30px;">结果同样。

<p style="margin-left: 30px;">初始化器注入

<p style="margin-left: 30px;">说是初始化器,其实就是一个方法。但是个特别的方法,这个方法需要添加特性[InjectionMethod]  

</span><span style=”color: #0000ff;”&gt;public</span><span style=”color: #000000;”&gt; IFlyable Fly { </span><span style=”color: #0000ff;”&gt;get</span><span style=”color: #000000;”&gt;; </span><span style=”color: #0000ff;”&gt;set</span><span style=”color: #000000;”&gt;; } [InjectionMethod] </span><span style=”color: #0000ff;”&gt;public</span> <span style=”color: #0000ff;”&gt;void</span><span style=”color: #000000;”&gt; Init(IFlyable fly) { </span><span style=”color: #0000ff;”&gt;this</span>.Fly =<span style=”color: #000000;”&gt; fly; } </span><span style=”color: #0000ff;”&gt;public</span> <span style=”color: #0000ff;”&gt;void</span><span style=”color: #000000;”&gt; Say() { Console.WriteLine(</span><span style=”color: #800000;”&gt;”</span><span style=”color: #800000;”&gt;会叫….</span><span style=”color: #800000;”&gt;”</span><span style=”color: #000000;”&gt;); }}</span></pre><p style="margin-left: 30px;">结果

<p style="margin-left: 30px;">