.Net Core 3.x MVC 自定義IOC

自定義IOC

為什么不直接用Core自帶的IOC?
1. 能夠理解本質(zhì)
2. 擴(kuò)展性更強(qiáng)

接上一章擴(kuò)展 : 《.Net Core 3.x MVC DIP與Factory》

這章完成目標(biāo):
1.多參數(shù)
2.多構(gòu)造函數(shù)(參數(shù)數(shù)量/特性標(biāo)識(shí))

開始擼碼

在 AspNetCore.IOCDI.Framework 添加 容器接口 和 容器實(shí)現(xiàn)類

添加特性類

容器接口

容器實(shí)現(xiàn) 躯肌,這里容器實(shí)現(xiàn)了無限級(jí)遞歸春宣,和 特性標(biāo)記

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace AspNetCore.IOCDI.Framework.CustomContainer
{
    /// <summary>
    /// 用來生產(chǎn)對(duì)象
    /// 第三方   業(yè)務(wù)無關(guān)性
    /// </summary>
    public class CoreContainer: ICoreContainer
    {
        private Dictionary<string, Type> CoreContainerDictionary = new Dictionary<string, Type>();

        /// <summary>
        /// where TTo 必須是 TFrom 類型的約束
        /// </summary>
        public void Register<TFrom, TTo>() where TTo: TFrom
        {
            //用TFrom的名稱作為Key ,用 TTo 這個(gè)類型作為Value
            this.CoreContainerDictionary.Add(typeof(TFrom).FullName,typeof(TTo));
        }

        /// <summary>
        /// 用類型名稱找出類型澜建,返回 創(chuàng)建好的對(duì)象
        /// </summary>
        /// <typeparam name="TFrom"></typeparam>
        /// <returns></returns>
        public TFrom Resolve<TFrom>() {
            return (TFrom)this.ResolveObject(typeof(TFrom));
        }

        /// <summary>
        /// 遞歸--可以完成不限層級(jí)的東西
        /// </summary>
        private object ResolveObject(Type abstracttype)
        {
            string key = abstracttype.FullName;

            Type type = this.CoreContainerDictionary[key];

            #region 選擇適合的構(gòu)造函數(shù)

            ConstructorInfo ctor = null;
            
            //是否有標(biāo)記,有特性標(biāo)記用特性標(biāo)記剑令,沒有就用參數(shù)最多的
            ctor = type.GetConstructors().FirstOrDefault(c => c.IsDefined(typeof(CoreConstructorAttribute), true));
            if (ctor == null)
            {
                //找參數(shù)最多的
                ctor = type.GetConstructors().OrderByDescending(c => c.GetParameters().Length).First();
            }
            
            #endregion


            #region 準(zhǔn)備構(gòu)造函數(shù)的參數(shù)

            List<object> paraList = new List<object>();

            foreach (var para in ctor.GetParameters())
            {
                Type paraType = para.ParameterType;//獲取參數(shù)的類型 IUserDAL
                
                object paraInstance = this.ResolveObject(paraType);
                
                paraList.Add(paraInstance);
            }

            #endregion

            object oInstance = Activator.CreateInstance(type, paraList.ToArray());

            return oInstance;
        }
    }
}

添加接口 ITestServiceA , 和 ITestServiceB 都是只有 一個(gè) show() 接口

TestServiceA 實(shí)現(xiàn)

using AspNetCore.IOCDI.Interface;
using System;

namespace AspNetCore.IOCDI.Service
{
    public class TestServiceA : ITestServiceA
    {
        public TestServiceA() {
            Console.WriteLine($"{ this.GetType().Name }被構(gòu)造拄查。吁津。。");
        }

        public void Show()
        {
            Console.WriteLine("這里是 TestServiceA Show.");
        }
    }
}

TestServiceB 實(shí)現(xiàn)

using AspNetCore.IOCDI.Interface;
using System;

namespace AspNetCore.IOCDI.Service
{
    public class TestServiceB : ITestServiceB
    {
        
        public TestServiceB(ITestServiceA iTestServiceA) {
            Console.WriteLine($"{ this.GetType().Name }被構(gòu)造堕扶。碍脏。。");
        }

        private ITestServiceA _iTestServiceA = null;

        public void Init(ITestServiceA testServiceA) {
            this._iTestServiceA = testServiceA;
        }

        public void Show()
        {
            Console.WriteLine("這里是 TestServiceB Show.");
        }
    }
}

修改DAL,添加一個(gè)特性的構(gòu)造函數(shù)稍算,一個(gè)多參數(shù)的構(gòu)造函數(shù)

修改控制臺(tái)項(xiàng)目 Program.cs

直接調(diào)試運(yùn)行典尾,這里看到BLL沒有加特性,就獲取最多參數(shù)的構(gòu)造函數(shù)

取到構(gòu)造函數(shù)IDAL糊探,然后遞歸ResolveObject方法

進(jìn)入ResolveObject后檢測(cè)到DAL是設(shè)置了特性的钾埂,就只能找到ItestServiceA

調(diào)試就能看出是如何把構(gòu)造函數(shù)里的依賴類創(chuàng)建成對(duì)象的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末河闰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子褥紫,更是在濱河造成了極大的恐慌淤击,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故源,死亡現(xiàn)場(chǎng)離奇詭異污抬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绳军,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門印机,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人门驾,你說我怎么就攤上這事射赛。” “怎么了奶是?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵楣责,是天一觀的道長。 經(jīng)常有香客問我聂沙,道長秆麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任及汉,我火速辦了婚禮沮趣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坷随。我一直安慰自己房铭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布温眉。 她就那樣靜靜地躺著缸匪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪类溢。 梳的紋絲不亂的頭發(fā)上凌蔬,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音豌骏,去河邊找鬼龟梦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窃躲,可吹牛的內(nèi)容都是我干的计贰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒂窒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼躁倒!你這毒婦竟也來了荞怒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤秧秉,失蹤者是張志新(化名)和其女友劉穎褐桌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體象迎,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荧嵌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砾淌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦撮。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汪厨,靈堂內(nèi)的尸體忽然破棺而出赃春,到底是詐尸還是另有隱情,我是刑警寧澤劫乱,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布织中,位于F島的核電站,受9級(jí)特大地震影響衷戈,放射性物質(zhì)發(fā)生泄漏狭吼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一脱惰、第九天 我趴在偏房一處隱蔽的房頂上張望搏嗡。 院中可真熱鬧,春花似錦拉一、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尺栖,卻和暖如春嫡纠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背延赌。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工除盏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挫以。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓者蠕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掐松。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踱侣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354