Spring.Net 框架(三)

容器所管理的對象由對象定義來配置,一個對象定義包含以下信息:
  • 對象類型,即所定義對象的實際類型。
  • 對象行爲,用來規定對象在IoC容器中的行爲(例如,是否佈署爲singleton,自動裝配的模式,依賴檢查的模式,初始化和銷燬方法等)。
  • 對象創建後要設置的屬性值。例如,一個線程池管理對象的可用線程數,或者用來創建線程池的類型信息,* 對象所需要的其它對象,例如一個對象的協作對象(同樣可通過屬性或構造器設置)。這些對象也可以叫做依賴項。

上面提到了用屬性和構造器參數來設置依賴項。Spring.NET支持兩種類型的IoC:類型2和類型3(分別是構造器參數注入和屬性注入)。也就是說,當一個對象被IoC容器創建時,既可以使用常規的屬性設值方法爲屬性設值,也可以直接向構造器傳遞參數來爲屬性賦值。(按:對.NET來說,“屬性注入” 似乎比“設值方法注入”更貼切)

上述概念直接對應對象定義中的一系列xml子節點,這些節點及相關的章節如下表所示:

 對象定義內容
內容 詳細信息
對象類型 對象的創建
id和name 對象標識符(id和name)
singleton或prototype Singleton和Prototype
對象屬性 設置對象的屬性和協作對象
構造器參數 設置對象的屬性和協作對象
自動裝配模式 自動裝配協作對象
依賴檢查模式 檢查依賴項
初始化方法 生命週期接口
銷燬(destruction)方法 生命週期接口

 

對象定義會包含對象的類型信息(也有例外,通過實例工廠方法創建對象和,抽象及子對象定義)。多數情況下,容器會根據對象定義中的type屬性值去直接調用相應類型的某個構造器。另外,容器也可以調用工廠方法來創建對象,這時type屬性的值就應該是包含工廠方法的類型(按:而不是要創建的類型,但通過該對象定義的名稱獲取的則是由工廠方法所創建的對象)。工廠方法的產品對象可以是工廠方法所在的類型,也可以是其它類型(按:很多情況下工廠方法位於單獨的類型中),這無關緊要。
 

使用構造器創建對象時,並不要求對象必須是某種特定的類型,也不需要了解它的實現方式(按:也就是說,類型不必去實現某個接口或擴展某個基類以求和 Spring.NET兼容,任何對象都可以佈署在容器中)。只要指明對象類型(以及它所在的程序集名稱)就可以了。不過,根據不同IoC容器的要求,可能需要爲類型(顯式的)定義默認構造器(即無參的構造器)。(按:由於.NET只會爲沒有構造器的類型自動添加默認構造器,所以Spring.NET允許類型不定義任何構造器;但如果在定義了含參構造器後仍需使用無參構造器,則必須進行顯式定義。)

XmlObjectFactory類實現了IObjectFactory接口,它可以處理XML文件中的對象定義,例如:

<object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary"/>


這個節點定義了一個名爲exampleObject的對象,它的類型是位於ExamplesLibrary程序集中的 Examples.ExampleObject類。請特別留心一下type屬性的格式:類型的全名,然後是一個逗號,最後是類型所在的程序集名稱。在上面的例子中,ExampleObject類定義在Examples命名空間,且位於ExamplesLibrary程序集中。

type屬性值必須包含類型所在的程序集名稱。另外,如果需要確保Spring.NET能按照預期的類型創建對象,則推薦使用程序集的強命名。不過,一般只有在用到GAC中的程序集時,才需要使用強命名。(按,例如,type="System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089")

如果需要爲嵌套類型創建對象,可以使用+號。例如,如果在類型Examples.ExampleObject嵌套定義了類型Person,就可以用下面的方式創建對象定義:

<object id="exampleObject" type="Examples.ExampleObject+Person, ExamplesLibrary"/>


如果應用程序能夠以標準的程序集探測機制訪問程序集(例如ASP.NET中的bin文件夾),那麼type屬性的值只需包括類型全名即可。這樣,當程序集改變後,不需要去修改每個對象定義的type屬性(主要是改些版本號等等),Spring.NET就會自動使用最新的程序集。

發佈了24 篇原創文章 · 獲贊 5 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章