Spring .NET 1.1 與容器設定

工程 | Mark Pollack | 2008 年 1 月 4 日 | ...

對於 Spring.NET 來說,這真是相當棒的一年。在 12 月 GA 發布之前,我們經歷了兩個里程碑和兩個候選版本。1.1 版本的首批程式碼早在 2004 年末由 Aleks Seovic 製作,他開始了 ASP.NET 框架的工作。簡而言之,這已經醞釀了很長一段時間。值此年末,這是回顧過去和現在的自然時機,我想感謝專案的其他成員和 Spring.NET 社群的所有貢獻和支持。我期待著美好的 2008 年!

Spring.NET 1.1 的功能集非常廣泛。用於依賴注入的 IoC 容器、AOP、ASP.NET 框架、宣告式事務管理和更多。但是,您可以獲得的最大效益來改善程式碼的結構和可測試性,就是將依賴注入和 AOP 添加到您眾所周知的開發人員工具箱中。依賴注入是這兩者中更基礎的技術,我想添加一些關於配置 Spring.NET 容器的選項的補充資訊。

顯然,配置容器最常見的方法是透過 XML。雖然 XML 提供了很大的靈活性,但它很冗長,而且每個人都喜歡在喝酒時發洩他們有多討厭 XML 配置文件(Spring 或其他)。編寫自訂程式碼可以大大減少冗長,刪除大量重複的 XML 並呈現專注於特定領域的屬性。例如,Spring.NET 為事務管理和 AOP 配置提供了這一點。然而,關於非 XML 配置的好消息是,Spring.NET 將在其下一個版本中添加基於屬性的 DI 和組件中帶註釋類別的自動檢測。正如您可能期望的那樣,所提供的功能將與 Spring Java 中的功能非常相似(請參閱此處此處),但會仔細考慮刪除多餘的 Java 人工因素(例如 JSR-250 屬性)並引入新功能(例如利用方法參數名稱實現按名稱連線語義),這僅在 .NET 上才有意義。

需要記住的一件事是,核心容器不依賴於基於 XML 的物件定義。容器有其自己的內部物件模型來處理這些定義。因此,物件定義可以來自各種格式。特別吸引人的是,根據我目前讀到的內容,是使用 DSL 工具包配置例外處理建議。其他有趣的配置方法是使用指令碼語言 DSL(請參閱此文章,了解 Spring Java + Groovy 整合)。最終,目標是讓您可以為手邊的任務選擇多種配置方法。

在目前版本中,有一些與容器的程式化控制和配置相關的功能似乎並不廣為人知。以下是這些功能的簡要概述。我將在參考文件中添加更完整的描述。

配置現有物件

主要的 IoC 容器介面,IApplicationContext,包含方法 ConfigureObject(object objectToConfigure, string objectDefnitionName)

根據與名稱關聯的物件定義,容器將對傳入的實例執行依賴注入。當您需要在執行時回應使用者請求建立物件時,這特別有用。在這種情況下,您通常會將一些特定於情況的資料傳遞到建構函式中,並讓容器配置物件其餘的、所有使用者請求共有的依賴項。

將現有物件註冊為單例

此功能定義在子介面上IApplicationContext,即IConfigurableApplicationContext。呼叫程式碼如下所示

((IConfigurableApplicationContext) applicationContext).ObjectFactory.RegisterSingleton("ObjectB", myObjectBInstance);

已註冊的物件不會被修改;它只是按原樣儲存在提供的名稱下。但是,其他物件可能會將此已註冊的物件作為依賴項引用。

依名稱和類型檢索物件

依名稱檢索物件很簡單

object o = applicationContext.GetObject("AccountManager")

然後轉換為適當的類型。您也可以按類型請求物件

IDictionary dict = context.GetObjectsOfType(typeof (IAccountManager));

這些 API 呼叫需要一些 TLC,方法是將它們泛型化,並提供一種方便的方法來獲取指定類型的單個物件而不是集合。

容器的程式化配置

類別GenericApplicationContext是一個 IoC 容器,它不假定任何特定的物件定義格式。您可以像這樣從嵌入式資源中載入基於 XML 的物件定義

GenericApplicationContext ctx = new GenericApplicationContext();

IObjectDefinitionReader objectDefinitionReader = new XmlObjectDefinitionReader(ctx); objectDefinitionReader.LoadObjectDefinitions("assembly://MovieFinder/AppContextContribution.xml");

然後,您可以將使用以下方式建立的其他物件定義添加到上下文中ObjectDefinitionBuilder. ObjectDefinitionBuilder提供了一個簡單的 Fluent 介面來簡化物件定義的建立。因此,ObjectDefinitionBuilder讓您可以將方法呼叫鏈結在一起,以建立一個物件定義,該定義大致對應於您在 Spring XML 中熟悉的元素。

IObjectDefinitionFactory objectDefinitionFactory = new DefaultObjectDefinitionFactory();

ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.RootObjectDefinition(objectDefinitionFactory, typeof(ColonDelimitedMovieFinder));

builder.AddConstructorArg("movies.txt") .SetLazyInit(true);

ctx.RegisterObjectDefinition("AnotherMovieFinder", builder.ObjectDefinition); // 處理物件定義… ctx.Refresh()

此程式碼摘自更新的「MovieFinder」範例,您可以從每日建置版本中下載。順便一提,IObjectDefinitionFactory還有另一個替代實作,WebObjectDefinitionFactory,用於 ASP.NET 頁面和使用者控制項,儘管您不太可能在這種情況下使用它。

以下是使用TestObject類別的另一個人工範例,該範例顯示了更多ObjectDefinitionBuilderAPI。

ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.RootObjectDefinition(objectDefinitionFactory, typeof (TestObject));

builder.AddPropertyValue("Age", 22) .AddPropertyValue("Name", "Joe") .AddPropertyReference("Spouse", "Spouse") .SetSingleton(false);

ctx.RegisterObjectDefinition("TestObject", builder.ObjectDefinition);

builder = ObjectDefinitionBuilder.RootObjectDefinition(objectDefinitionFactory, typeof(TestObject));

IList friends = new ArrayList(); friends.Add(new TestObject("Dan", 34)); friends.Add(new TestObject("Mary", 33));

builder.AddPropertyValue("Friends", friends) .AddConstructorArg("Susan") .AddConstructorArg(23) .SetSingleton(false);

ctx.RegisterObjectDefinition("Spouse", builder.ObjectDefinition);

如果您已經有一個基於 XML 的應用程式上下文,您可以將其傳遞給GenericApplicationContext的建構函式,這意味著它將充當後者的父應用程式上下文,形成一個簡單的根/子層次結構。您也可以使用ContextRegistry以名稱註冊上下文,以提供服務定位器樣式的查詢。

目前,ObjectDefinitionBuilderAPI 相當「字串化」,這意味著雖然可以註冊物件以進行「按類型」連線,但它比需要的更冗長。改進此 API 的「流暢性」是未來版本中需要改進的另一個領域。

好了,各位,就到這裡了。祝大家新年快樂!

取得 Spring 電子報

透過 Spring 電子報保持聯繫

訂閱

取得領先

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部