Spring.Objects.Factory.IObjectFactory接口有多個實現類。最常用的是 Spring.Objects.Factory.Xml.XmlObjectFactory。關於如何在代碼中與IObjectFactory交互,與IObjectFactory交互。IApplicationContext接口所定義的增強功能將在IApplicationContext簡介中討論。
前文提到過,Spring.NET框架的核心原則是非侵入性。簡單的說,就是應用程序的代碼不需要對Spring.NET的API有任何依賴。然而,如果要通過IObjectFactory或Spring.Context.IApplicationContext接口充分利用IoC容器的功能,有時候還必須要初始化這兩個接口的某個實現類。爲此,可以在代碼中使用new操作符來顯式創建容器(在C#中,VB開發人員則使用New操作符。按:後文中,舉凡涉及到含義爲“管理對象的容器”而非特指接口的名稱時,將原文中的IObjectFactory或IApplicationContext稱爲 “容器”或“IoC容器”);另一種更爲簡單的方式是在.NET應用程序的標準配置文件中用一個自定義節點來配置容器。一旦容器建立,應用程序代碼就可能不再需要與之發生顯式的交互了。
下面代碼創建了XmlObjectFactory類的一個實例,XmlObjectFactory是IObjectFactory的實現類之一。我們假定在objects.xml文件中定義了要裝配(按:裝配的概念見後文)和發佈的服務對象。將該文件的信息傳遞給XmlObjectFactory的構造器,即可創建一個容器,參見如下代碼:
代碼中使用了Spring.NET的IResource接口。IResource能以簡單統一的方式訪問許多可用System.IO.Stream表示的IO資源。 IResource接口中將對IResource接口展開討論。這些IO資源一般是獨立的文件或者URL,但也可以是.NET程序集的內嵌資源。通過IResource接口,可以用簡單的URI格式來描述資源的位置,比如可用file://object.xml來表示一個文件。此外,IResource也支持很多其它協議,如 http等。
前文提到IApplicationContext是IObjectFactory的超集,我們一般都會用IApplicationContext來作爲容器。在創建容器時可以像上例一樣用IResource實例化IApplicationContext接口的任何一個實現類。另外, IApplicationContext支持用多個配置文件創建容器(按:此處的配置文件是指包括了Spring.NET對象定義的XML文件,而非特指.config文件,下同):
下面是引用.NET程序集內嵌資源時的URI語法:assembly://<AssemblyName>/<NameSpace>/<ResourceName>
若要在VS中創建一個內嵌的資源,必須在文件屬性編輯器中將xml文件的Build Action設爲Embedded Resource。並且,如果自上次成功建立項目之後,該屬性的變更是本次所做的唯一更改,則需要顯式的重新生成項目。如果使用NAnt建立項目,需要在 csc任務中添加一個<resources>節點。可參見Spring.Core.Tests項目中的build文件,該項目隨 Spring.NET一起發佈。
更好的創建方式是在標準.NET應用程序配置文件中(App.config或Web.config)添加自定義配置節點。以下的XML節點可以創建與前例相同的容器:
<context>節點的type屬性是可選的,在Windows應用中,其默認值就是Spring.Context.Support.XmlApplicationContext,所以下面的配置和上面完全相同:
spring和context節點的名稱不是任意的,必須是"spring"和"context",Spring.NET本身將 "spring/context"作爲字符串常量定義在了AbstractApplicationContext類中以表示上下文的節點名稱。若要引用由以上配置創建的容器,可使用下面的代碼:
ContextRegistry類既可用來初始化應用程序上下文,也可用來以服務定位器風格對容器中的對象進行訪問。注意,使這一切成爲可能的是Spring.Context.Support.ContextHandler類,該類實現了FCL的IConfigurationSectionHandler接口。必須在.NET配置文件的<configSections> 節點中註冊這個類,如下所示:
註冊了這個節點處理器後,配置文件中的<spring>節點才能起作用。
在某些情況下,用戶不需要以任何方式顯式創建容器,Spring.NET可以自行創建。例如,Spring.NET中的Spring.Web模塊可以將 IApplicationContext作爲Web應用程序正常啓動進程的一部分進行自動裝載。目前正在研究如何爲WinForms應用程序提供類似的支持
關於如何通過編程方式管理IObjectFactory,稍後再講。下面我們先討論IObjectFactory接口所使用的對象配置格式。(按:凡適用於IObjectFactory的內容,必定也適用於IApplicationContext)
基本上,IObjectFactory的配置信息由一個或多個對象定義構成。在基於XML的工廠中,這些對象定義表現爲一個或多個< object>子節點,它們的父節點必須是<objects>(按:objects節點的xmlns元素是必需的,必須根據不同的應用添加不同的命名空間,請留意各個章節中的相關內容。
隨Spring.NET一起發佈的schema文檔可以簡化對XML對象定義的驗證過程。該文檔是完全開放的(參見附錄A,Spring.NET的spring-objects.xsd)。目前,除了驗證XML文檔外,該文檔還有一個用途,就是在具備XSD感知能力的編輯器(比如VS.NET)內進行代碼提示。可參考第二十四章,與Visual Studio.NET集成。在Spring.NET的網站上可以下載到spring-objects.xsd的最新版本。
XML對象定義也可以放在.NET的標準應用程序配置文件中。此時也需要爲<objects>節點預先註冊相應的節點處理器,類型爲 Spring.Context.Support.DefaultSectionHandler。然後,就可以在.NET的.config文件中爲一或多個容器配置對象定義了,如下所示:
上下文嵌套和從其它文件中導入對象定義會討論創建配置文件時可用的其它節點。
我們也可以在配置文件中爲IApplicationContext註冊自定義的資源處理器、schema解析器、類型轉換器和類型別名等等。IApplicationContext配置一節中將討論這些內容。