Autofac學(xué)習(xí)(一)

開始

首先我們根據(jù)官方的文檔做一個例子矾屯,來體驗一下:
首先安裝Autofac包


Autofac
  • 按照控制反轉(zhuǎn)(IoC)的思想構(gòu)建你的應(yīng)用程序
  • 添加Autofac引用
  • application啟動代碼里…
  • 創(chuàng)建ContainerBuilder對象
  • 注冊組件
  • Build容器并且保存以備用
  • 在程序執(zhí)行階段
  • 從容器創(chuàng)建一個作用域
  • 在作用域里獲取組件的實例

應(yīng)用程序構(gòu)建

在我們的例子里腹暖,我們將定義一個類來輸出當前的日期榛泛。當然饥漫,我們不希望和Console綁定因為我們想在控制臺不可用的情況依然可以測試這個類眯娱。

同樣惠桃,輸入日期的方法被定義成抽象的,這樣的話如果我們想新增一個輸出明天日期的方法就可以直接重載邑飒。

我們先定義一段代碼:

using System;

namespace DemoApp
{
    // 這個接口幫助我們從Console類解耦"輸出"方法
    // 我們不需要關(guān)心怎樣輸出,只要知道能輸出即可
    public interface IOutput
    {
        void Write(string content);
    }

    // 這里IOutput接口的實現(xiàn)完成向控制臺的輸出级乐。
    // 技術(shù)上講疙咸,我們可以實現(xiàn)IOutput接口完成Debug或者Trace或者
    // 其他的輸出方式
    public class ConsoleOutput : IOutput
    {
        public void Write(string content)
        {
            Console.WriteLine(content);
        }
    }

    // 這個接口解耦實際輸出日期的接口。
    // 像IOutput一樣风科,這個處理在后面的接口里抽象化
    public interface IDateWriter
    {
        void WriteDate();
    }

    // ToadyWriter將上述兩個接口進行組合
    // 注意這里的構(gòu)造函數(shù)參數(shù)是IOutput類型
    // 這樣這個writer的輸出由IOutput的實現(xiàn)決定
    // 更進一步說撒轮,他實現(xiàn)了WriteDate輸出今天的日期
    // 你可以再定義一個輸出不同格式或者不同日期的方法
    public class TodayWriter : IDateWriter
    {
        private IOutput _output;
        public TodayWriter(IOutput output)
        {
            this._output = output;
        }

        public void WriteDate()
        {
            this._output.Write(DateTime.Today.ToShortDateString());
        }
    }
}

應(yīng)用程序啟動

在應(yīng)用程序啟動過程中,首先要創(chuàng)建一個ContainerBuilder并且用它注冊你的組件贼穆。組件是一個表達式, .NET類型或者其他的一段暴露一個或者多個服務(wù)的代碼并且可以用在其他的依賴里题山。

簡單來說,就像下面的例子所述故痊,定義一個實現(xiàn)某個接口的.NET類型

public class SomeType : IService
{
}

你可以通過下面兩種方法之一來定位這個類型

  • 指定類型本身顶瞳,SomeType
  • 指定接口,一個IService

在這個例子里愕秫,這個組件是SomeType慨菱,他暴露的服務(wù)是SomeTypeIService.

在Autofac里,你應(yīng)當用一個ContainerBuilder來注冊他們戴甩,如下:

// 創(chuàng)建你的builder
    var builder = new ContainerBuilder();

    // 通常你只關(guān)心這個接口的一個實現(xiàn)
    builder.RegisterType<SomeType>().As<IService>();

    // 當然抡柿,如果你想要全部的服務(wù)(不常用),可以這么寫:
    builder.RegisterType<SomeType>().AsSelf().As<IService>();

在我們的例子里等恐,我們要注冊所有的組件(類)并且獲取他們的服務(wù)(接口)洲劣,這樣這些對象連接起來會更方便

我們還要保存這個容器,這樣我們可以在后面用來解析這些類型

using System;
using Autofac;

namespace DemoApp
{
    public class Program
    {
        private static IContainer Container { get; set; }

        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<ConsoleOutput>().As<IOutput>();
            builder.RegisterType<TodayWriter>().As<IDateWriter>();
            Container = builder.Build();

            // 我們將在這個方法里使用依賴注入课蔬,后面我們會定義它
            WriteDate();
        }

        public static void WriteDate()
        {
            // 創(chuàng)建作用域囱稽,解析IDateWriter,使用二跋,然后釋放
            using (var scope = Container.BeginLifetimeScope())
            {
                var writer = scope.Resolve<IDateWriter>();
                writer.WriteDate();
            }
        }
    }
}

當你運行你的程序時…

  • WriteDate方法要求Autofac提供IDateWriter.
  • Autofac發(fā)現(xiàn)IDateWriter映射到TodayWriter所以創(chuàng)建了一個TodayWriter對象
  • Autofac發(fā)現(xiàn)TodayWriter構(gòu)造函數(shù)需要IOutput
  • Autofac發(fā)現(xiàn)IOutput映射到ConsoleOutput战惊,所以創(chuàng)建一個新的ConsoleOutput的實例
  • Autofac使用ConsoleOutput實例完成TodayWriter的創(chuàng)建
  • Autofac返回一個完整的TodayWriter對象給”WriteDate”來消費

最后,如果你希望你的應(yīng)用輸出一個不同的日期扎即,你可以實現(xiàn)另外一個IDateWriter然后再app啟動的時候改變一下注冊過程吞获。你不需要修改任何其他的類。耶谚鄙,控制反轉(zhuǎn)了各拷!

注意:通常來說,服務(wù)定位大多都考慮了反面模式(參考) http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx闷营。就是說烤黍,在你的代碼里到處分散的手動創(chuàng)建作用域不是最佳的實現(xiàn)方式知市。使用Autofac整合庫以后,你通常不需要做本例中的處理速蕊。相反的嫂丙,對象很少在應(yīng)用程序的”頂級”位置解析或者在手動解析。當然规哲,怎么設(shè)計你的app是由你自己決定的跟啤。

更進一步

這個例子告訴你怎么使用Autofac,但是你還需要了解更多的內(nèi)容

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唉锌,一起剝皮案震驚了整個濱河市隅肥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糊秆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件议双,死亡現(xiàn)場離奇詭異痘番,居然都是意外死亡,警方通過查閱死者的電腦和手機平痰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門汞舱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宗雇,你說我怎么就攤上這事昂芜。” “怎么了赔蒲?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵泌神,是天一觀的道長。 經(jīng)常有香客問我舞虱,道長欢际,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任矾兜,我火速辦了婚禮损趋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椅寺。我一直安慰自己浑槽,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布返帕。 她就那樣靜靜地躺著桐玻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荆萤。 梳的紋絲不亂的頭發(fā)上畸冲,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼邑闲。 笑死算行,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的苫耸。 我是一名探鬼主播州邢,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褪子!你這毒婦竟也來了量淌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫌褪,失蹤者是張志新(化名)和其女友劉穎呀枢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笼痛,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡裙秋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缨伊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘刑。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刻坊,靈堂內(nèi)的尸體忽然破棺而出枷恕,到底是詐尸還是另有隱情,我是刑警寧澤谭胚,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布徐块,位于F島的核電站,受9級特大地震影響灾而,放射性物質(zhì)發(fā)生泄漏蛹锰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一绰疤、第九天 我趴在偏房一處隱蔽的房頂上張望铜犬。 院中可真熱鬧,春花似錦轻庆、人聲如沸癣猾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纷宇。三九已至,卻和暖如春蛾方,著一層夾襖步出監(jiān)牢的瞬間像捶,已是汗流浹背上陕。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拓春,地道東北人释簿。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像硼莽,于是被迫代替她去往敵國和親庶溶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,101評論 1 32
  • 簡書訊 昨日懂鸵,萬眾矚目的第45屆(廣州)國際美博會隆重拉開帷幕偏螺。首日期間,美輪美奐和極具時尚沖擊力的美博會迎來了數(shù)...
    SmartNews閱讀 854評論 0 0
  • 面西南望 留我只是沉默的繁星 予我只是靜默的晚霞 亦或是無言的隔山 又或沖不破的海峽 戀昔難忘 繁星點點星光熠熠 ...
    Alex0309閱讀 210評論 0 0
  • 勞動產(chǎn)生喜悅 勞動有苦根甜果匆光,喜悅從勞苦與艱辛中滲出套像,工作的樂趣潛藏在超越困難的過程之中。 怎么理解勞動有苦根甜果...
    馬哲峰閱讀 244評論 0 0
  • 每個家族里劲够,總有一代人震桶,要開疆拓土休傍! 曾茫茫人海中來到北京,天大地大蹲姐,不知何處落腳磨取,到現(xiàn)在有一個我的...
    越努力越幸運_趙雙董閱讀 525評論 1 2