基於unity框架構造IOC容器

一.寫在前面

基於上一篇經過配置文件造成ioc容器的例子,咱們採用另一種方式去造成ioc容器,那就是unity框架。git

二.unity簡介

Unity 應用程序塊(Unity)是一個輕量級、可擴展的依賴注入容器,支持構造函數、屬性和方法調用注入。程序員

1.控制反轉 (IoC) 模式,這是一種設計模式,它描述了用於支持對象能夠「查找」它們須要的其餘對象的實例的插件架構的技術。編程

2.依賴注入 (DI) 模式,這是 Ioc 模式的一種特殊狀況,是一種基於改變對象的行爲而不改變類的內部的接口編程技術。開發人員編寫實現接口的類代碼,並基於接口或者對象類型使用容器注入依賴的對象實例到類中。用於注入對象實例的技術是接口注入、構造函數注入、屬性(設置器)注入和方法調用注入。設計模式

 

三.爲何要實現DI(依賴注入)

爲了靈活的在外部就拿到了實現後的接口,經過unity能夠有不少方式去實現這樣的要求。架構

下面分常見的兩種方式(構造函數注入和屬性注入依賴)。框架

說明:爲何要注入依賴?由於之前的拿到接口的地方是在調用者(類)的內部實現接口的。好比一個類A須要用的接口B,那常常咱們會這樣,在A的內部的某個方法下須要使用到接口B,那咱們就在這個方法裏面去實現這個接口,而後調用這個接口。那麼這個類A與接口B的依賴關係就放在了類A的裏面。這樣並不算的上一種好的設計,假若類A中調用的接口實現變更了,那咱們不得不進入類A裏面進行調整,爲了防止這樣的狀況發生,依賴注入的設計方式產生了,它將接口的實現轉移到了外部,有效的防止了若是後期接口的實現變了,咱們只須要在外部那接口的地方換一下便可,不用操心類A裏面。接下來咱們看看具體例子函數

四.unity框架的引用

在須要引用unity框架的項目上,添加引用,選擇管理NeGet程序包,搜索unity,下載安裝便可。如圖:編碼

若是找不到,樓主提供下載unity包 密碼:rp2qspa

下載完後引用便可.net

五.經過unity構造ioc容器

咱們改掉調用類原先內部實現接口而後調用的方式,接口的實如今外部拿到,或經過構造函數或屬性注入進去便可。

1.構造函數注入接口

namespace Unity_IocDemo
{
    public class Operater
    {
        private ICooker COOKER;
      
        public Operater(ICooker cooker)//構造函數將接口傳入進來
        {
            COOKER = cooker;
       
        }
        public void cook() {
            COOKER.Cook();
        }
    }
}

構造本身的ioc_factory

namespace LogicLayer
{
    public class IOC_Factory
    {

        public  IUnityContainer container { get; set; }
        public IOC_Factory()
        {
            container = new UnityContainer();//容器
        }

        /// <summary>
        /// 依賴注入
        /// </summary>
        /// <typeparam name="Toperater">須要調用接口的調用類</typeparam>
        /// <returns></returns>
        public  Toperater GetOperater<Toperater>()
        {
            Toperater operater = container.Resolve<Toperater>();//DI(依賴注入)
            return operater;
        }



        /// <summary>
        /// 註冊接口容器
        /// </summary>
        /// <typeparam name="Tinterface">接口</typeparam>
        /// <typeparam name="Tclass">實現Tinterface接口的具體類</typeparam>
        public  void register<Tinterface,Tclass>() where  Tclass:Tinterface
        {
            container.RegisterType<Tinterface, Tclass>();//註冊接口與具象依賴
        }

      

    }
}

當咱們使用Operater類時,就能夠利用ioc_factory工廠拿到它的實例了。這個過程是經過unity框架自動綁定的。以下:

namespace Unity_IocDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            IOC_Factory ioc = new IOC_Factory();//ioc容器
            ioc.register<ICooker, potatoHelper>();//註冊依賴關係
            Operater operater1 = ioc.GetOperater<Operater>();//注入依賴關係
            operater1.cook();
            Console.Read();
        }
    }
}

分析:我的感受這樣作,有什麼鳥用?說實話,尚未採用配置文件造成ioc拿接口好。若是說註冊依賴關係的時候仍是會出現具體類的類名,那這個耦合並無真正意義上被解除。至少program類與ICooker依賴了,且與potatohelper也耦合了。惟一的方便就是自動將接口實現後注入到了operater類中。這種方式有待後續考察

2.採用屬性方式注入

那就須要在調用類中設置接口屬性,並加上Dependency屬性註解,這樣unity框架會自動將接口注入到該屬性下,調用類代碼以下:

namespace Unity_IocDemo
{
    public class Operater
    {
        [Dependency]//須要被注入的屬性標記
        public IPerson person { get; set; }
        private ICooker COOKER;
        public Operater(ICooker cooker)//構造函數將接口傳入進來
        {
            COOKER = cooker;
       
        }


        public void cook() {
            COOKER.Cook();
        }
    }
}

依賴注入代碼以下:

namespace Unity_IocDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            IOC_Factory ioc = new IOC_Factory();//ioc容器
            ioc.register<ICooker, potatoHelper>();//註冊依賴關係
            ioc.register<IPerson, perosin>();
            Operater operater1 = ioc.GetOperater<Operater>();//注入依賴關係
            operater1.person.eat();
            operater1.cook();
            Console.Read();
        }
    }
}

用法是構造函數同樣,只須要註冊依賴關係就能夠了。

運行結果以下:

我的以爲用屬性注入應該是要比構造函數注入要合適,至少不會形成構造函數的參數過多過長,儘管一個調用類不可能同時使用到不少藉口,通常都是一到三個接口。

六.總結

今天採用unity自動從外界將實現的接口注入到了調用類中,可是這種外界注入的過程也涉及到了具體類的類名,這也算是隻用耦合了。可是相比使用配置文件造成ioc容器利用反射來拿接口的方式,又減小了在配置文件上的配置。由於若是具體類過多,配置信息無疑會邊的很長。樓主也懷疑這樣所有卸載配置文件裏是否穩當。而採用unity自動注入,雖然解決了將具體類寫入配置的麻煩,卻也在註冊接口與具體類依賴關係上,耦合了。總之各有各的不足,有點都是同樣。在用的過程當中好好體會吧。

七.關於

一個不甘於天天只編碼,企圖擺脫思想上的麻痹的程序員。qq:739462304.任何其餘領域的事情,我都有情趣瞭解。

八. 項目demo

點我下載

相關文章
相關標籤/搜索