Unity Container基礎(chǔ)入門

Unity Container是一個(gè)微軟出的IoC(控制反轉(zhuǎn)框架)强衡。能夠更好地解耦各種對(duì)象员萍,提高軟件的可維護(hù)性绪商。使用的Unity一般會(huì)有兩種方式:

  1. 代碼注入:

    public interface IPerson
    {
      string Name {get; set; };
      string ShowName();
    }
    
    public class Mike: IPerson 
    {
      public string Name {get; set; };
      
      public string ShowName() {
        return string.Format("My name is: {0}", ClassName);
      }
    }
    
    public string Demo() 
    {
      // 注冊(cè)container
      IUnityContainer container = new UnityContainer();
      container.RegisterType<IPerson, Mike>();
      
      // 獲取實(shí)例
      IPerson person = container.Resolve<IPerson>();
      
      // 使用實(shí)例
      person.Name = "Mike";
      Console.WriteLine(person.ShowName());
    }
    

    ?

  2. 配置文件注入:

如果使用配置文件的話路鹰,需要在<configSections>中配置對(duì)應(yīng)的配置信息

<configSections>

    <!--聲明容器-->
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
 
  </configSections>
 
  <unity>
    <!--定義類型別名-->
    <aliases>
      <add alias="IProduct" type="UnityTest.IProduct,UnityTest" />
      <add alias="Milk" type="UnityTest.Milk,UnityTest" />
    </aliases>
    <!--容器-->
    <container name="MyContainer">
      <!--映射關(guān)系-->
      <register type="IProduct"  mapTo="Milk"></register>
    </container>
  </unity>
public string ContainerConfiguation() 
{
    IUnityContainer container = new UnityContainer();
    
    // 加載配置信息
    container.LoadConfiguration("Config");
    UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
    section.Configure(container, "Config");
    
    // 獲得實(shí)例
    IPerson person = container.Resolve<IPerson>("Mike");
    //使用person實(shí)例
    ...
}

生命周期管理

  1. TransientLifetimeManager

    默認(rèn)情況下使用的就是這種生命周期管理器炊邦,每次獲取實(shí)例的時(shí)候都會(huì)重新創(chuàng)建一個(gè)新的對(duì)象。

    container.RegisterType<IPerson, Mike>();
    //等同于
    container.RegisterType<IPerson, Mike>(new TransientLifetimeManager);
    

    使用配置文件則是:

    <register type="IPerson" mapTo="Mike" name="Mike">
     <lifetime type="transient" />
    </register>
    

    ?

  2. ContainerControlledLifetimeManager

    使用單例模式創(chuàng)建實(shí)例。

    container.RegisterType<IPerson, Mike>(new ContainerControlledLifetimeManager());
    

    配置文件則是:

    <register type="IPerson" mapTo="Mike" name="Mike">
     <lifetime type="singleton" />
    </register>
    
  1. HierarchicalLifetimeManager

分層生命周期管理器,Unity這種分級(jí)容器的好處就在于我們可以對(duì)于有不同生命周期的對(duì)象放在不同的容器中,如果一個(gè)子容器被釋放,不會(huì)影響到其它子容器中的對(duì)象硼瓣,但是如果根節(jié)點(diǎn)處父容器釋放后,所有的子容器都將被釋放置谦。

  1. PerResolveLifetimeManager

處理循環(huán)引用的問題巨双。

  1. PerThreadLifetimeManager

每個(gè)線程返回同一實(shí)例

6.ExternallyControlledLifetimeManager

外部控制生命周期管理器,這個(gè)生命周期管理允許你使用RegisterType和RegisterInstance來注冊(cè)對(duì)象之間的關(guān)系霉祸,但是其只會(huì)對(duì)對(duì)象保留一個(gè)弱引用筑累,其生命周期交由外部控制,也就是意味著你可以將這個(gè)對(duì)象緩存或者銷毀而不用在意UnityContainer丝蹭,而當(dāng)其他地方?jīng)]有強(qiáng)引用這個(gè)對(duì)象時(shí)慢宗,其會(huì)被GC給銷毀 掉。

依賴注入方式

Unity中提供了三種依賴注入的方式:構(gòu)造函數(shù)注入奔穿、屬性注入镜沽、方法注入。

  1. 構(gòu)造函數(shù)注入
 container.RegisterType<IPerson, Mike>(new InjectionConstructor(type,參數(shù)))
  1. 屬性注入
  1. 方法注入

    ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贱田,一起剝皮案震驚了整個(gè)濱河市缅茉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌男摧,老刑警劉巖蔬墩,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耗拓,居然都是意外死亡拇颅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門乔询,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樟插,“玉大人,你說我怎么就攤上這事竿刁』拼福” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵食拜,是天一觀的道長(zhǎng)鸵熟。 經(jīng)常有香客問我,道長(zhǎng)监婶,這世上最難降的妖魔是什么旅赢? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮惑惶,結(jié)果婚禮上煮盼,老公的妹妹穿的比我還像新娘。我一直安慰自己带污,他們只是感情好僵控,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鱼冀,像睡著了一般报破。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上千绪,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天充易,我揣著相機(jī)與錄音,去河邊找鬼荸型。 笑死盹靴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑞妇。 我是一名探鬼主播稿静,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辕狰!你這毒婦竟也來了改备?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤蔓倍,失蹤者是張志新(化名)和其女友劉穎悬钳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偶翅,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡他去,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倒堕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灾测。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垦巴,靈堂內(nèi)的尸體忽然破棺而出媳搪,到底是詐尸還是另有隱情,我是刑警寧澤骤宣,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布秦爆,位于F島的核電站,受9級(jí)特大地震影響憔披,放射性物質(zhì)發(fā)生泄漏等限。R本人自食惡果不足惜爸吮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望望门。 院中可真熱鬧形娇,春花似錦、人聲如沸筹误。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨剪。三九已至哄酝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祷膳,已是汗流浹背陶衅。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留直晨,地道東北人万哪。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抡秆,于是被迫代替她去往敵國(guó)和親奕巍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理儒士,服務(wù)發(fā)現(xiàn)的止,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,870評(píng)論 2 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法着撩,類相關(guān)的語法诅福,內(nèi)部類的語法,繼承相關(guān)的語法拖叙,異常的語法氓润,線程的語...
    子非魚_t_閱讀 31,581評(píng)論 18 399
  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!薯鳍! 因?yàn)镾cala是基于Java虛擬機(jī)咖气,也就是...
    燈火gg閱讀 3,421評(píng)論 1 24
  • 晨跑鍛煉5年了崩溪,從一開始每天掙扎要不要跑出去,到現(xiàn)在無論酷暑嚴(yán)寒每天早晨都想跑出去斩松;從一開始跑上100米就氣喘吁吁...
    樂跑貓閱讀 966評(píng)論 5 6