<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 56, comments - 77, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    IoC 問題域

    Posted on 2010-07-11 22:18 切爾斯基 閱讀(2316) 評(píng)論(3)  編輯  收藏

    IoC避不開的一個(gè)問題是如何處理應(yīng)用程序的模塊化, 因?yàn)镮oC通常針對(duì)單個(gè)對(duì)象提供了良好的支持, 比如依賴管理,生命周期管理,部署時(shí)配置甚至運(yùn)行時(shí)配置, 但往往一組內(nèi)聚的互相協(xié)作的對(duì)象才構(gòu)成應(yīng)用程序基本的構(gòu)建塊. 這組內(nèi)聚對(duì)象間的協(xié)作關(guān)系是實(shí)現(xiàn)細(xì)節(jié), 包括單個(gè)對(duì)象的構(gòu)造函數(shù)和屬性也是, 如果把這些暴露出來, 固然可以提高靈活性, 但是以最后的部署階段的復(fù)雜性以及難以維護(hù)性為代價(jià)的. 以配置文件為例, 可能需要在包含了幾百個(gè)對(duì)象定義的配置文件中, 去改動(dòng)七八個(gè)屬性, 變換五六個(gè)實(shí)現(xiàn), 來適應(yīng)不同的運(yùn)行環(huán)境

    兩個(gè)解決這個(gè)問題的方向, 一個(gè)是IoC框架提供模塊化支持, 以及部署時(shí)支持, 一種是IoC框架應(yīng)該避開這個(gè)問題, 這本不屬于IoC的范圍, 應(yīng)該交由專門的模塊化框架如OSGi去解決

    在我相對(duì)熟悉的IoC框架中, Autofac試圖提供"Module"這個(gè)概念來解決一部分問題. 對(duì)象間的協(xié)作可以隱藏在Module對(duì)象中, 一些必要的參數(shù)可以通過Module的屬性設(shè)置進(jìn)來, 而對(duì)使用者,對(duì)部署只需暴露Module對(duì)象即可. 這是以喪失靈活性為代價(jià)的, 替換某個(gè)內(nèi)部對(duì)象的實(shí)現(xiàn)變成了Hack, 需要通過團(tuán)隊(duì)成員間的交流, 源代碼集體所有來完成. 如果在Module對(duì)象內(nèi)部枚舉擴(kuò)展點(diǎn)的所有實(shí)現(xiàn), 通過部署時(shí)的參數(shù)來挑選某個(gè)實(shí)現(xiàn), 則會(huì)引入不必要的依賴, 更是得不償失

    個(gè)人傾向于第二種. 誰介紹一下.Net平臺(tái)上的模塊化框架?



    所以相對(duì)聚焦一點(diǎn), 了解一下IoC框架在處理單個(gè)對(duì)象的時(shí)候所需要解決的問題

    1, 部署時(shí)如何方便的支持產(chǎn)品環(huán)境和測(cè)試環(huán)境, 即在不同環(huán)境下提供同一接口的不同實(shí)現(xiàn)


    這個(gè)甚至不需要IoC框架解決, 應(yīng)用開發(fā)人員在不同環(huán)境下提供不同配置文件即可. 那問題變成了

    2, 如何簡化配置, 使得框架能夠自動(dòng)識(shí)別依賴


    這個(gè)被稱為Auto wire, 一般根據(jù)構(gòu)造函數(shù)參數(shù)或?qū)傩缘念愋蛠砥ヅ湟蕾? 那么帶來的一個(gè)問題是

    3, 運(yùn)行時(shí)如何動(dòng)態(tài)切換同一個(gè)類型的不同實(shí)現(xiàn), 比如用戶選擇了只讀模式, 那么所有的Save操作都應(yīng)被忽略不做任何事, 可以通過提供Save操作的Dummy版本來實(shí)現(xiàn)


    Auto wire根據(jù)類型匹配有一定的局限性, 即同一個(gè)運(yùn)行時(shí)環(huán)境有某個(gè)接口的多個(gè)實(shí)現(xiàn)怎么辦.  這里實(shí)際上有一個(gè)概念, 即對(duì)象的標(biāo)識(shí). 而類型只是標(biāo)識(shí)的一種. 另外一種適應(yīng)性更廣的標(biāo)識(shí)是字符串. 有的框架稱之為ID, 有的稱之為name. 標(biāo)識(shí)的重要特征就是在一個(gè)運(yùn)行時(shí)環(huán)境里是唯一的. 類型標(biāo)識(shí)因此也可以轉(zhuǎn)化為字符串標(biāo)識(shí), 取其全名就可以了. (標(biāo)識(shí)本身是個(gè)概念, 可以用一個(gè)類來表達(dá), 然后有不同的子類實(shí)現(xiàn), 如基于類型的標(biāo)識(shí), 基于字符串的標(biāo)識(shí)等)

    因此就有兩種策略: 一種是允許運(yùn)行時(shí)某個(gè)對(duì)象可以重新聲明依賴的標(biāo)識(shí), 一種是運(yùn)行時(shí)用同樣標(biāo)識(shí)的對(duì)象替換原先的實(shí)現(xiàn). 后一種相對(duì)容易實(shí)現(xiàn)一點(diǎn), 按注冊(cè)順序Last One Win就可以了

    如果同一個(gè)類型的多個(gè)實(shí)例需要同時(shí)存在, 則部署時(shí)給予不同的ID即可. 然而另一個(gè)問題是

    4, 多用戶環(huán)境下, 如何保證每個(gè)用戶都有自己的對(duì)象組合而不互相干擾


    IoC框架一般被稱為IoC容器. 容器這個(gè)概念是對(duì)運(yùn)行時(shí)環(huán)境,上下文的封裝, 提供了一組基礎(chǔ)設(shè)施, 以及運(yùn)行時(shí)所需的各種服務(wù), 最重要的一點(diǎn)是, 它提供了在同一個(gè)進(jìn)程里的隔離. 多用戶環(huán)境下, 可以創(chuàng)建多個(gè)彼此獨(dú)立的容器, 每個(gè)容器負(fù)責(zé)創(chuàng)建所需的對(duì)象, 提供所需的服務(wù), 彼此之間互不影響. 于是帶來新的問題,

    5, 對(duì)象的生命周期如何管理


    很顯然, 有的對(duì)象概念上屬于全局, 在程序運(yùn)行過程中不能創(chuàng)建多個(gè)實(shí)例, 也不能被銷毀. 有的跟用戶的一次操作, 一次請(qǐng)求相關(guān)聯(lián), 同一次請(qǐng)求中可以復(fù)用同一個(gè)對(duì)象實(shí)例, 但不同請(qǐng)求必須創(chuàng)建不同的對(duì)象實(shí)例. 有的則每次需要訪問它的時(shí)候都得創(chuàng)建一個(gè)新的實(shí)例. 容器必須提供基礎(chǔ)設(shè)施, 讓應(yīng)用開發(fā)者可以指定對(duì)象的生命周期, 并在周期結(jié)束時(shí)銷毀所有該銷毀的對(duì)象. C# 提供了 Dispose 機(jī)制, 可供利用



    其它的一些問題, 比如:

    • 如何支持composite, decorator, proxy模式
    • 如何方便用戶注冊(cè), 包括自動(dòng)注冊(cè)
    • 如何注入容器創(chuàng)建的對(duì)象到用戶手工創(chuàng)建的對(duì)象中
    • 如何與現(xiàn)有各種框架集成
    • 如何避免循環(huán)引用: Constructor/property dependencies
    • Open generics injection
    • List injection    Unregistered resolution
    • Auto-mocking
    • Startable
    • Strongly-typed Activation Events
    • Adding to an Existing Container


    評(píng)論

    # re: IoC 問題域  回復(fù)  更多評(píng)論   

    2010-07-12 08:52 by 臨遠(yuǎn)
    目前來說,傾向于讓IoC容器只管模塊內(nèi)部的事情,Ioc容器所面對(duì)的:1.自動(dòng)組裝,2.統(tǒng)一aop切面。這種Internal Ioc也可以通過OSGi的上下文獲取注冊(cè)的服務(wù)。不過也面對(duì)著一個(gè)問題,就是自動(dòng)注冊(cè)的服務(wù)還需要一個(gè)靈活的釋放機(jī)制。

    至于一個(gè)interface多個(gè)implementation的情況,倒是好解決。jsr250里Resource注解里可以指定name,spring提供的Quarified可以指定name,guice里可以用Named標(biāo)示。OSGi可以用filter。實(shí)際上這是一個(gè)前置設(shè)計(jì)的問題,提前把可能存在哪些可能的選項(xiàng)都列出來。

    # re: IoC 問題域  回復(fù)  更多評(píng)論   

    2010-07-13 10:28 by anders
    // 部署時(shí)如何方便的支持產(chǎn)品環(huán)境和測(cè)試環(huán)境
    如果說模塊是系統(tǒng)的豎切,這里實(shí)際上是個(gè)是系統(tǒng)的橫切,解決方式其實(shí)也很簡單,預(yù)先讀取當(dāng)前環(huán)境變量,根據(jù)該環(huán)境變量加載同環(huán)境相關(guān)的IoC配置。
    我相信同環(huán)境相關(guān)的IoC配置不會(huì)很多。

    // 運(yùn)行時(shí)如何動(dòng)態(tài)切換同一個(gè)類型的不同實(shí)現(xiàn)
    只能靠代理方式,由代理根據(jù)用戶配置進(jìn)行路由選擇(相當(dāng)于查詢vtable)

    // 多用戶環(huán)境下, 如何保證每個(gè)用戶都有自己的對(duì)象組合而不互相干擾
    也只能靠代理方式,由代理根據(jù)當(dāng)前用戶進(jìn)行路由選擇(相當(dāng)于查詢vtable)

    // 對(duì)象的生命周期如何管理
    可以參考下java的spring,spring核心提供了:singleton和prototype
    spring web提供了request,session,結(jié)合jsf提供了view;spring web flow提供了flash,flow和conversation,可以自定義提供如threadlocal這樣的

    # re: IoC 問題域  回復(fù)  更多評(píng)論   

    2010-07-13 22:07 by 切爾斯基
    @anders

    運(yùn)行時(shí)如何動(dòng)態(tài)切換同一個(gè)類型的不同實(shí)現(xiàn), 以及多用戶環(huán)境下, 如何保證每個(gè)用戶都有自己的對(duì)象組合而不互相干擾:

    我們用Autofac, 這兩個(gè)問題都是通過創(chuàng)建 Inner Container 解決的

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 无码专区永久免费AV网站 | 日韩在线天堂免费观看 | 51精品视频免费国产专区| 最新国产AV无码专区亚洲| 全部一级一级毛片免费看| 国产99视频精品免费视频7| 亚洲精品亚洲人成在线| 最近中文字幕无免费视频| 91在线免费观看| 亚洲精品无码久久久| 丰满妇女做a级毛片免费观看| 在线日韩av永久免费观看| 含羞草国产亚洲精品岁国产精品| 成年人免费网站在线观看| 亚洲综合精品伊人久久| 日韩免费无砖专区2020狼| 深夜A级毛片视频免费| 亚洲精品视频在线看| 97在线视频免费公开视频| 亚洲日韩乱码中文无码蜜桃臀网站| 美女无遮挡拍拍拍免费视频| 中文字幕精品无码亚洲字| 中文字幕日本人妻久久久免费| 亚洲国产精品无码久久久蜜芽| 国产色爽免费无码视频| 亚洲精品影院久久久久久| 91免费精品国自产拍在线不卡| 亚洲男同gay片| 免费很黄很色裸乳在线观看| 国产精品免费大片一区二区| 亚洲av日韩av激情亚洲| 99热在线精品免费全部my| 精品亚洲成A人在线观看青青| 国内精品99亚洲免费高清| 99精品视频在线观看免费播放| 亚洲中字慕日产2020| 亚洲av手机在线观看| 久久99毛片免费观看不卡| 亚洲18在线天美| 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品福利网泷泽萝拉|