本文主要介紹:
關於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())
{
////實現
}