微軟企業庫Unity學習筆記(一)
本文主要介紹:
關于Unity container配置,注冊映射關系、類型,單實例、已存在對象和指出一些container的基本配置,這只是我關于Unity的學習心得和筆記,希望能夠大家多交流相互學習到更多知識,謝謝大家的支持。
我們可以通過以下兩種方法給Unity container中創建映射:
- RegisterType:這個方法可以往container中注冊一種類型或映射關系,當我們需要調用該類型的實例時,container會自動實例化該類型的對象,無需通過new someName方法實例化對象(例如:使用Resolve或ResolveAll方法獲取注冊類型的實例),當沒有指定實例化對象的生命周期,將使用默認的TransientLifetimeManager(每次調用Resolve或ResolveAll方法時都會實例化一個新的對象)。
- RegisterInstance:這個方法是往container中注冊一個已存在實例,通過Resolve或ResolveAll方法獲取該類型的實例,默認使用ContainerControlledLifetimeManager管理對象生命周期,而且container中會保持對象的引用(簡而言之每次調用Resolve或ResolveAll方法都會調用同一個對象的引用)。
1.1 注冊一個接口或類的映射到具體類型:
使用Register方法可以往容器中注冊一種類型或映射關系
- l 往容器中注冊一種類型RegisterType<Type>
- l 往容器中注冊一種映射關系RegisterType< RegisteredType, TargetType >
調用RegisterType<RegisteredType, TargetType>()方法可以往容器中注冊一種映射關系,RegisteredType是一個接口或類,而TargetType必需實現該接口或繼承該類。
1.2 注冊一個單例類或單例類型實例:
涉及到對象的生命周期(Lifetime Managers):
- l 默認的情況下使用TransientLifetimeManager管理對象的生命周期,以下兩種方法效果一樣:
container.RegisterType<IMyService, CustomerService>();
container.RegisterType<IMyService, CustomerService>(new TransientLifetimeManager());
- l 使用ContainerControlledLifetimeManager創建單例實例
container.RegisterType<IMyService, CustomerService>(new ContainerControlledLifetimeManager());
- l 使用ExternallyControlledLifetimeManager只可以保持對象的弱引用
container.RegisterType<IMyService, CustomerService>(new ExternallyControlledLifetimeManager
關于強引用和弱引用:
強引用:當一個根指向一個對象時,該對象不可能被執行垃圾收集,因為程序代碼還在訪問該對象。
弱引用:允許垃圾收集器收集對象,同時允許應用程序訪問該對象,結果是執行哪個要取決于時間。
- l 使用PerThreadLifetimeManager在同一個線程返回同一個對象實例,不同線程對象實例不相同
container.RegisterType<IMyService, CustomerService>(new PerThreadLifetimeManager());
在使用RegisterType注冊類型或映射,如果對對象生命周期進行,將使用默認的TransientLifetimeManager,它不會在container中保存對象的引用,簡而言之每當調用Resolve或ResolveAll方法時都會實例化一個新的對象。當我們想在container中保存對象的引用的時我們可以使用ContainerControlledLifetimeManager管理對象的生命周期,簡而言之每次調用Resolve或ResolveAll方法都會調用同一個對象的引用。
1.3 注冊一個存在對象作為單件實例:
注冊一個存在的對象我們使用的是RegisterInstance,它默認使用ContainerControlledLifetimeManager管理對象的生命周期,回顧以下
RegisterType和RegisterInstance區別:
|
Method |
Default Lifetime Managers |
Same Lifetime Managers |
|
RegisterType |
TransientLifetimeManager |
ContainerControlledLifetimeManager |
|
RegisterInstance |
ContainerControlledLifetimeManager |
ContainerControlledLifetimeManager |
當RegisterType和RegisterInstance都使用ContainerControlledLifetimeManager時的區別:
MSDN:If you used the RegisterType method to register a type, Unity creates a new instance of the registered type during the first call to the Resolve or ResolveAll method or when the dependency mechanism injects instances into other classes. Subsequent requests return the same instance.
If you used the RegisterInstance method to register an existing object, Unity returns this instance every time you call the Resolve or ResolveAll method or when the dependency mechanism injects instances into other classes.
翻譯:如果使用RegisterType方法注冊一種類型,當第一次調用Resolve 或ResolveAll 方法或依賴機制注入一個實例到其他類時,Unity會實例化該注冊類型,之后的調用都返回相同實例。
如果使用RegisterInstance方法注冊一個存在對象,當我們調用Resolve和ResolveAll方法或賴機制注入一個實例到其他類時,Unity每次都返回該對象實例。
1.4 使用container的fluent interface屬性:
這意味著你可以在一條語句中使用方法鏈
IUnityContainer myContainer = new UnityContainer()
.RegisterType<IMyService, DataService>()
.RegisterType<IMyUtilities, DataConversions>()
.RegisterInstance<IMyService>(myEmailService);
由于IUnityContainer 接口實現了IDispose接口,所有我們可以使用Using控制container資源釋放
////IUnityContainer實現接口IDisposable,所以可以使用
////using有效釋放對象占用的系統資源。
using (IUnityContainer container = new UnityContainer())
{
////實現
}
|
|
關于作者:[作者]:
JK_Rush從事.NET開發和熱衷于開源高性能系統設計,通過博文交流和分享經驗,歡迎轉載,請保留原文地址,謝謝。 |

本文主要介紹:
關于Unity container配置,注冊映射關系、類型,單實例、已存在對象和指出一些container的基本配置,這只是我關于Unity的學習心得和筆記,希望能夠大家多交流相互學習到更多知識,謝謝大家的支持。
浙公網安備 33010602011771號