.NET 控制反轉(zhuǎn)框架:AutoFac

主要翻譯自Autofac的官方文檔殖卑。

概念

控制反轉(zhuǎn)背后的思想是帖蔓,與其在程序中把類(lèi)捆綁在一起讓它們“New”出各自的依賴(lài)危彩,不如把它們切割開(kāi)炼杖,使得依賴(lài)在類(lèi)的構(gòu)建被傳遞

基本實(shí)例

例如有一個(gè)類(lèi)景用,用來(lái)打印當(dāng)前時(shí)間涵叮;但我們不想讓它和Console捆綁在一起惭蹂,因?yàn)槲覀冞€要測(cè)試它;而且可能還要在Console不可用的場(chǎng)景下使用它割粮。以下是一個(gè)示例盾碗。

Output接口和它的實(shí)現(xiàn),規(guī)定了并實(shí)現(xiàn)了所需要的功能:Write()

    public interface IOutput
    {
        void Write(string content);
    }

    public class ConsoleOutput : IOutput 
    {
        public void Write(string content) 
        {
            Console.WriteLine(content);
        }
    }

“寫(xiě)日期”接口及其實(shí)現(xiàn)舀瓢。接收一個(gè)IOutput廷雅,并把內(nèi)容交給它打印:

public interface IDateWriter
{
    void WriteDate();
}

public class TodayWriter : IDateWriter
{
    private IOutput _output;
    public TodayWriter(IOutput output) 
    {
        this._output = output;
    }

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

在主類(lèi)(客戶(hù)端代碼)內(nèi)京髓,將所需要的類(lèi)注冊(cè)給ContainerBuilder

public class Program
{
    // Autofac 的 Container 對(duì)象航缀,用來(lái)創(chuàng)建其它對(duì)象
    private static IContainer Container { get; set; }

    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        // 向 Container 注冊(cè)所需的類(lèi)型
        builder.RegisterType<ConsoleOutput>().As<IOutput>();
        builder.RegisterType<TodayWriter>().As<IDateWriter>();
        Container = builder.Build();

        // 創(chuàng)建服務(wù)端類(lèi)的實(shí)例并調(diào)用相關(guān)功能的過(guò)程在這個(gè)方法里,下面會(huì)詳細(xì)說(shuō)明堰怨。
        WriteDate();
    }
}

注冊(cè)好類(lèi)型之后就可以創(chuàng)建對(duì)象了芥玉。創(chuàng)建對(duì)象需要使用生命周期范圍。一個(gè)Container本身就是一個(gè)生命周期范圍备图,但不應(yīng)該直接用Container來(lái)創(chuàng)建對(duì)象灿巧,而是先用它來(lái)創(chuàng)建一個(gè)新的生命周期范圍,以便于用完之后關(guān)掉揽涮。

public static void WriteDate()
{
    using (var scope = Container.BeginLifetimeScope())
    {
        var writer = scope.Resolve<IDateWriter>();
        writer.WriteDate();
    }
}

scope.Resolve<IDateWriter>()方法用來(lái)創(chuàng)建實(shí)例抠藕。它所要?jiǎng)?chuàng)建實(shí)例的IDateWriter類(lèi),在實(shí)例化的時(shí)候要求一個(gè)IOutput實(shí)例蒋困;但我并沒(méi)有將這個(gè)IOutput實(shí)例傳遞給它幢痘,而是由它自己去創(chuàng)建。這是控制反轉(zhuǎn)框架最核心的功能家破。

這個(gè)過(guò)程大體是這樣的:

  • WriteDate 靜態(tài)方法中,我要求Autofac創(chuàng)建一個(gè)IDateWriter實(shí)例购岗;
  • Autofac發(fā)現(xiàn)IDateWriter映射給了TodayWriter汰聋,所以就開(kāi)始創(chuàng)建TodayWriter
  • Autofac發(fā)現(xiàn)TodayWriter的構(gòu)造函數(shù)要求一個(gè)IOutput實(shí)例喊积;
  • Autofac發(fā)現(xiàn)ConsoleOutput映射給了IOutput烹困,于是開(kāi)始創(chuàng)建ConsoleOutput的實(shí)例;
  • Autofac使用這個(gè)新創(chuàng)建的ConsoleOutput實(shí)例乾吻,完成了TodayWriter實(shí)例的創(chuàng)建髓梅;
  • Autofac將這個(gè)TodayWriter實(shí)例返回,就此完成創(chuàng)建IDateWriter實(shí)例的任務(wù)绎签。

基本實(shí)例的補(bǔ)充

在上面創(chuàng)建實(shí)例的過(guò)程中枯饿,對(duì)于服務(wù)端類(lèi)型全程使用接口,使得在客戶(hù)端代碼中創(chuàng)建實(shí)例的過(guò)程不依賴(lài)于服務(wù)端代碼中的類(lèi)诡必。但在類(lèi)型注冊(cè)(RegisterType())的過(guò)程中奢方,還是使用了服務(wù)端的類(lèi)型,所以并沒(méi)有實(shí)現(xiàn)完全的解耦合◇郑可以用配置文件來(lái)代替類(lèi)型引用稿蹲,實(shí)現(xiàn)完全的解耦合。

<configuration>
    <configSections>
        <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
    </configSections>
    <autofac defaultAssembly="AutofacDemo">
        <components>
            <component type="AutofacDemo.TodayWriter, AutofacDemo" service="AutofacDemo.IDateWriter" />
            <component type="AutofacDemo.ConsoleOutput, AutofacDemo" service="AutofacDemo.IOutput" />
            ...
        </components>
    </autofac>
</configuration>

這樣在客戶(hù)端代碼中鹊奖,就可以使用配置文件來(lái)完成類(lèi)型的注冊(cè):

var builder = new ContainerBuilder();
// 向 Container 注冊(cè)所需的類(lèi)型
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
Container = builder.Build();

另外

以上设哗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咒林,隨后出現(xiàn)的幾起案子熬拒,更是在濱河造成了極大的恐慌,老刑警劉巖垫竞,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎粟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡欢瞪,警方通過(guò)查閱死者的電腦和手機(jī)活烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遣鼓,“玉大人啸盏,你說(shuō)我怎么就攤上這事∑锼睿” “怎么了回懦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)次企。 經(jīng)常有香客問(wèn)我怯晕,道長(zhǎng),這世上最難降的妖魔是什么缸棵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任舟茶,我火速辦了婚禮,結(jié)果婚禮上堵第,老公的妹妹穿的比我還像新娘吧凉。我一直安慰自己,他們只是感情好踏志,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布阀捅。 她就那樣靜靜地躺著,像睡著了一般针余。 火紅的嫁衣襯著肌膚如雪也搓。 梳的紋絲不亂的頭發(fā)上赏廓,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音傍妒,去河邊找鬼幔摸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颤练,可吹牛的內(nèi)容都是我干的既忆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗦玖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼患雇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宇挫,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苛吱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后器瘪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翠储,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年橡疼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了援所。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欣除,死狀恐怖住拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情历帚,我是刑警寧澤滔岳,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挽牢,受9級(jí)特大地震影響澈蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卓研,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睹簇。 院中可真熱鬧奏赘,春花似錦、人聲如沸太惠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凿渊。三九已至梁只,卻和暖如春缚柳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搪锣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工秋忙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人构舟。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓灰追,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親狗超。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弹澎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)努咐,斷路器苦蒿,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評(píng)論 6 342
  • 我們每天都要吃飯,很多上班族為求快羔沙,沒(méi)有重視怎樣才能吃得健康躺涝。如果三餐不夠健康,那我們就需要利用三餐后的半小時(shí)來(lái)達(dá)...
    紅塵擺渡666閱讀 532評(píng)論 0 1
  • 早上起來(lái)大風(fēng)起扼雏,繼之而起的是大雨坚嗜。 今天夜班,偷得浮生一日閑诗充。雨苍蔬,不管是淅淅瀝瀝的還是如瀑布般飛流直下的,都有一種...
    sgd閱讀 161評(píng)論 0 0