首页 > 代码库 > 小抄:选择 Unity 的对象生命周期管理员

小抄:选择 Unity 的对象生命周期管理员

Unity 框架提供了数种生命周期管理员,各有相同和相异之处。刚开始接触时,难免头昏。
制作这张小抄,只是为了要帮助自己理解和记忆。如果你也用 Untiy,或可参考看看。

文字說明:

  • TransientLifetimeManager:每次解析时一律建立新的对象,且 Unity 容器不会保存该对象的参考(即容器不负责释放该对象)。此控制模式一般称为 Transient。
  • ContainerControlledLifetimeManager:每次解析时都固定返回同一个既有对象,并且在容器本身摧毁时一并释放该对象。此生命周期模式的效果等同于 Singleton 模式。这也是呼叫 RegisterInstance 方法时的默认生命周期管理员。
  • PerResolveLifetimeManager:类似 TransientLifetimeManager,主要差别在它在深层解析的过程中会重复使用同一个对象,而不会每次都建立新的对象。
  • PerThreadLifetimeManager:基本上,此生命周期等于是线程范围内的 Singleton。其行为与 ContainerControlledLifetimeManager 雷同,差别仅在于它会依线程来决定是否要建立新的对象。此生命周期管理员不负责释放对象。
  • ExternallyControlledLifetimeManager:与 ContainerControlledLifetimeManager 一样具有 Singleton 的效果,但主要的差别在于,ExternallyControlledLifetimeManager 是保存对象的弱参考(weak reference)。如此一来,你就可以完全掌控释放对象的时机,例如在用完对象时立刻呼叫它的 Dispose 方法来释放该对象。显然,此生命周期管理员不负责释放对象。
  • HierarchicalLifetimeManager:用于阶层式容器,亦即容器本身又包含了子容器的场合。基本上,此生命周期的行为等同于 ContainerControlledLifetimeManager 再加上对子容器的额外控制:子容器有自己的 Singleton 范围,不会跟父容器共享同一个对象。
  • PerRequestLifetimeManager:此生命周期管理员只适用于 Web 应用程序。它能够确保在同一个 HTTP 请求的范围内解析某类型时总是返回同一个对象。基本上,它就是一次 HTTP 请求范围内的 Singleton。   

小抄:选择 Unity 的对象生命周期管理员