程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Unity 1.0中文文檔:Unity簡介

Unity 1.0中文文檔:Unity簡介

編輯:關於.NET

Unity 應用程序塊(Unity)是一個輕量級、可擴展的依賴注入容器,支持構造函數、屬性和方法調用注入。它有下列優點:

簡化了對象的創建,尤其是分層的對象結構和依賴,並簡化了應用程序代碼。

支持需求的抽象,這允許開發人員在運行時或者配置中指定依賴,並簡化了橫切關注點的管理。

通過延遲將配置組裝到容器來提高靈活性。

服務定位功能允許客戶代碼保存或者緩存容器。這在開發人員可以持久化容器到 ASP.NET Session 或者 Application 中的 ASP.NET Web 應用程序中特別有用。

本主題包含了一系列有用的章節,它們提供了有助於決定 Unity 應用程序塊是否滿足需求的信息。本主題的章節如下:

常見場景

示例應用程序代碼

Unity 應用程序塊的亮點

確定何時使用 Unity 應用程序塊

除了此介紹材料以外,文檔還包含了下列主題:

用 Unity 應用程序塊開發應用程序。此主題解釋了如何在應用程序中使用 Unity 應用程序塊。它列出了系統需求,解釋了如何配置應用程序塊以完成常見任務,以及展示了如何添加應用代碼到需要應用程序塊的地方。還列出了程序塊的屬性。

關鍵場景。此主題示范了如何使用應用程序塊完成最常見的操作。

Unity 應用程序塊的設計。此主題解釋了應用程序塊設計的考慮以及其他相關的考慮。

擴展和修改 Unity 應用程序塊。此主題解釋了如何擴展應用程序塊,以及如何修改源代碼。

部署和操作。此主題解釋了如何部署和更新應用程序塊的程序集,以及利用由程序塊暴露的度量。

Unity 快速入門。此主題漫游了示范如何在應用程序中執行常見操作的快速入門應用程序。

常見場景

Unity 應用程序塊解決忙於基於組件的軟件工程的開發人員所面對的問題。現代業務系統除了單獨解決橫切關注點如日志、認證、授權、緩存和異常處理的組件以外,還由定制的業務對象和在應用程序中完成特殊的或者一般的任務的組件組成。

成功構建這樣的應用程序的關鍵是獲得解耦的或者極度松耦合的設計。松耦合的應用程序更加靈活、更加易於維護。同時易於在開發期間進行測試。可以模擬強實質依賴的對象的樁(輕量級模擬的實現)。例如,數據庫連接、網絡連接、ERP 連接和富用戶接口組件。

依賴注入是一種用於構建松耦合應用程序的主要技術。它提供了處理對象間依賴的方法。例如,一個處理用戶信息的對象可能依賴於訪問數據存儲、驗證信息和檢查用戶是否被授權執行更新的其他對象。依賴注入技術可以確保用戶類正確的初始化及組裝所有這些對象,特別是依賴可被抽象的地方。

下列設計模式定義了簡化處理的架構和開發方法:

控制反轉 (IoC) 模式,這是一種一般的模式,它描述了用於支持對象可以“查找”它們需要的其他對象的實例的插件架構的技術。

依賴注入 (DI) 模式,這是 Ioc 模式的一種特殊情況,是一種基於改變對象的行為而不改變類的內部的接口編程技術。開發人員編寫實現接口的類代碼,並基於接口或者對象類型使用容器注入依賴的對象實例到類中。用於注入對象實例的技術是接口注入、構造函數注入、屬性(設置器)注入和方法調用注入。

此指南中的場景包含了下列場景以示范可以使用 Unity 應用程序塊的方法:

創建 Unity 容器

通過類型解析對象

根據類型和注冊名解析對象

解析特定類型的所有對象

使用 BuildUp 綁定對象而不是由容器創建

用於構造函數注入的注解(Annotating)對象

用於屬性(設置器)注入的注解(Annotating)對象

用於方法調用注入的注解(Annotating)對象

另外,Unity 快速入門示范了許多這些技術,包括一個 MVC 模式的簡單實現和一個做為自定義容器擴展的 Event Broker 服務的實現。

示例應用代碼

通過使用依賴注入框架和控制反轉機制,開發人員可以生成並組成可以包含依賴對象實例和設置的自定義類和對象。Unity 應用程序塊支持這種功能,允許開發人員使用如配置的容器注入、構造函數注入、屬性注入和方法調用注入這些技術來生成和組合對象的實例和所有依賴的對象和設置。

Unity 應用程序塊暴露了二個用容器注冊類型和映射的方法:

RegisterType。此方法用容器注冊一個類型。在適當的時候,容器將構建一個指定的類型的實例。這可以通過類的特性或者調用 Resolve 方法時初始化依賴注入。構建的對象的生命周期與在方法參數中指定的生命周期一致。如果沒有指定生命周期的值,將為類型注冊一個暫時的生命周期,這意味著容器將為每一個對 Resolve 的調用創建一個新的實例。

RegisterInstance。此方法將一個指定的類型的已存在的實例注冊到容器,並帶有指定的生命周期。容器將在生命周期內返回已有的實例。如果沒有指定生命周期,實例將擁有容器控制的生命周期。

類型的配置容器注冊

做為 RegisterType 和 Resolve 方法的重載的一個示例,下列代碼注冊了一個用於接口 IMyService 的映射,將指定容器將返回 CustomerService 類(實現了IMyService 接口)的實例。

C#

IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IMyService, CustomerService>();
IMyService myServiceInstance = myContainer.Resolve<IMyService>();

Visual Basic

Dim myContainer As IUnityContainer = New UnityContainer()
myContainer.RegisterType(Of IMyService, CustomerService)()
Dim myServiceInstance As IMyService = myContainer.Resolve(Of IMyService)()

已有對象實例的配置容器注冊

做為使用 RegisterInstance 和 Resolve 方法重載的一個示例,下列代碼注冊了實現了 IMyService 接口的 LoggingService 類的一個已有實例,然後獲取此實例:

C#

IUnityContainer myContainer = new UnityContainer();
LoggingService myExistingObject = new LoggingService();
myContainer.RegisterInstance<IMyService>(myExistingObject);
IMyService myServiceInstance = myContainer.Resolve<IMyService>();

Visual Basic

Dim myContainer As IUnityContainer = New UnityContainer()
Dim myExistingObject As New LoggingService()
myContainer.RegisterInstance(Of IMyService)(myExistingObject)
Dim myServiceInstance As IMyService = myContainer.Resolve(Of IMyService)()

構造函數注入

做為構造函數注入的一個示例,如果開發人員用 Unity 容器的 Resolve 方法實例化的類有一個構造函數定義了一個或多個對其他類的依賴,Unity 容器將自動創建指定在構造函數參數中的依賴的對象實例。例如,下列代碼展示了依賴於 LoggingService 對象的 CustomerService 類。

C#

public class CustomerService
{
 public CustomerService(LoggingService myServiceInstance)
 {
  // work with the dependent instance
  myServiceInstance.WriteToLog("SomeValue");
 }
}

Visual Basic

Public Class CustomerService
 Public Sub New(myServiceInstance As LoggingService)
  ' work with the dependent instance
  myServiceInstance.WriteToLog("SomeValue")
 End Sub
End Class

在運行時,開發人員使用容器的 Resolve 方法創建了 CustomerService 類的一個實例,這導致了實例生成框架將具體類 LoggingService 的一個實例注入到 CustomerService 類中。

C#

IUnityContainer uContainer = new UnityContainer();
CustomerService myInstance = uContainer.Resolve<CustomerService>();

Visual Basic

Dim uContainer As IUnityContainer = New UnityContainer()
Dim myInstance As CustomerService = uContainer.Resolve(Of CustomerService)()

屬性(設置器)注入

除了前面描述的構造函數注入以外,Unity 應用程序塊還支持屬性和方法調用注入。下列代碼示范了屬性注入。ProductService 類暴露了一個引用另一個名為 SupplierData 類(沒有定義在下列代碼中)的實例的屬性。要強制依賴對象的依賴注入,開發人員必須像下列代碼中一樣使用 Dependency 特性裝飾屬性的聲明:

C#

public class ProductService
{
 private SupplierData supplier;
 [Dependency]
 public SupplierData SupplierDetails
 {
  get { return supplier; }
  set { supplier = value; }
 }
}

Visual Basic .NET

Public Class ProductService
 Private supplier As SupplierData
 <Dependency()> _
 Public Property SupplierDetails() As SupplierData
  Get
   Return supplier
  End Get
  Set (ByVal value As SupplierData)
   supplier = value
  End Set
 End Property
End Class

現在,使用 Unity 應用程序塊創建 ProductService 類的一個實例將自動生成 SupplierData 類的一個實例,並將它設置為 ProductService 類的 SupplierDetails 屬性的值。

注意:關於在應用程序中如何使用這些和其他 Unity 應用程序塊的特性的更多細節,請參見關鍵場景。

Unity 應用程序塊的亮點

Unity 應用程序塊包含了下列特性:

它提供了用於構建(或者組合)對象實例的機制,它可能包含其他依賴的對象實例。

它暴露了支持使用映射和對象(包括單件(singleton)實例)配置容器的 RegisterType 方法,以及返回可以包含任何依賴的對象的構建對象實例的 Resolve 方法。

通過允許注入預配置的對象到由程序塊構建的類中來提供控制反轉(IoC)功能。開發人員可以在構建函數中指定接口或者類的類型(構造函數注入),或者應用屬性和方法特性來初始化屬性注入和方法調用注入。

支持容器的繼承層次。容器可能有子容器,允許將對象定位查詢從子容器傳遞到父容器中。

可以從標准配置系統如 XML 文件中讀取配置信息,並使用它來配置容器。

不需要對象類的定義。不需要應用特性到類上(使用屬性或者方法調用注入除外),以及無限制的類聲明。

支持開發人員可以實現的自定義容器擴展。例如,允許其他對象構建方法和容器特性,如緩存。

決定何時使用 Unity 應用程序塊

依賴注入提供了簡化代碼、抽象對象間依賴以及自動生成依賴對象實例的機會。然而,處理可能會對性能有少量的影響,並且在僅僅簡化已有的依賴時會增加復雜度。

通常,可以在下列時機使用 Unity 應用程序塊:

對象和類可能依賴於其他對象和類時。

依賴很復雜或者需要抽象。

要利用構造函數、方法或者屬性調用注入特性。

要管理對象實例的生命周期。

要在運行時配置和改變依賴。

要在 Web 應用程序中跨越回發緩存或者持久化依賴。

在下列時機不使用 Unity 應用程序塊:

對象和類不依賴於其他對象或者類。

依賴非常簡單並且不需要抽象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved