[IOC]Unity使用
Unity是什么?
unity是patterns&practices團隊開發的一個輕量級、可擴展的依賴注入容器。
Unity特性
1、它提供了創建(或者裝配)對象實例的機制,而這些對象實例可能還包含了其它被依賴的對象實例。
2、Unity允許將預先配置的對象注入到類中,實現了inversion of control(Ioc)的功能。在Unity中,支持constructor injection(構造器注入),property setter injection(屬性設置值注入)和method call injection(方法注入)。
3、支持容器的體系結構。一個容器可以有子容器,允許從子容器到父容器的對象定位查詢。
4、可以通過配置文件進行準備和配置容器。
5、不會影響到類的定義(屬性設置值注入和方法注入除外),這也是輕量級容器的一個體現。
6、支持自定義的容器擴展。
Unity實踐
新建一個控制臺程序,Nuget安裝Unity
新建一個叫IFlyable 飛行能力的接口。
/// <summary>/// 飛行接口/// </summary>public interface IFlyable{void Fly();}一個飛禽類,并實現飛行的接口
/// <summary>/// 飛禽類/// </summary>public class Bird : IFlyable{public void Fly(){Console.WriteLine("會飛的鳥......");}}在Main方法中,通過Unity容器實例化一個飛禽對象,并讓它飛。
static void Main(string[] args){IUnityContainer container = new UnityContainer();//注入container.RegisterType<IFlyable, Bird>();IFlyable bird = container.Resolve<IFlyable>();bird.Fly();Console.Read();}輸出
?如果多個實現類呢?
添加個飛機類,讓其實現飛行接口
/// <summary>/// 飛機/// </summary>public class Plane : IFlyable{public void Fly(){Console.WriteLine("超音速飛行......");}}main方法
static void Main(string[] args){IUnityContainer container = new UnityContainer();//注入container.RegisterType<IFlyable, Bird>();container.RegisterType<IFlyable, Plane>();IFlyable bird = container.Resolve<IFlyable>();IFlyable plane = container.Resolve<IFlyable>();bird.Fly();plane.Fly();Console.Read();}結果
Unity:在一個接口有多個實現的情況下,如果沒有進行別名區分,會選擇最后注入的實現。
加入別名
static void Main(string[] args){IUnityContainer container = new UnityContainer();//注入container.RegisterType<IFlyable, Bird>("bird");container.RegisterType<IFlyable, Plane>("plane");IFlyable bird = container.Resolve<IFlyable>("bird");IFlyable plane = container.Resolve<IFlyable>("plane");bird.Fly();plane.Fly();Console.Read();}結果
注意
當一個接口有多個實現類的時候,注入的時候需要通過別名進行區分。
構造函數注入
我們添加一個接口
/// <summary>/// 具有會叫能力的接口/// </summary>public interface ISayable{IFlyable Fly { set; get; }void Say();}添加一個鸚鵡類,有飛行能力,并且會叫
/// <summary>/// 鸚鵡類/// </summary>public class Parrot : ISayable{public IFlyable Fly{get;set;}public Parrot(IFlyable fly){this.Fly = fly;}public void Say(){Console.WriteLine("會叫....");}}main方法中,注入
static void Main(string[] args){IUnityContainer container = new UnityContainer();//注入//構造函數中注入 鳥類對象container.RegisterType<IFlyable, Bird>();container.RegisterType<ISayable, Parrot>();ISayable Parrot = container.Resolve<ISayable>();Parrot.Fly.Fly();Parrot.Say();Console.Read();}結果
屬性注入
/// <summary>/// 鸚鵡類/// </summary>public class Parrot : ISayable{[Dependency]public IFlyable Fly{get;set;}public void Say(){Console.WriteLine("會叫....");}}通過在屬性上面添加[Dependency]特性,即可注入。
Main方法與上面的相同。
結果同樣。
初始化器注入
說是初始化器,其實就是一個方法。但是個特別的方法,這個方法需要添加特性[InjectionMethod] ?
/// <summary>/// 鸚鵡類/// </summary>public class Parrot : ISayable{public IFlyable Fly{get;set;}[InjectionMethod]public void Init(IFlyable fly){this.Fly = fly;}public void Say(){Console.WriteLine("會叫....");}}結果
總結
以上是生活随笔為你收集整理的[IOC]Unity使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑法术高端无线路由器劫持漏洞攻击技术原理
- 下一篇: zookeeker如何解决HBase单节