我知道类似的问题被多次询问(例如:这里,这里,这里和这里),但它是针对Unity的早期版本,其答案取决于使用的LifetimeManager类.
文件说:
Unity使用从LifetimeManager基类继承的特定类型(统称为生命周期管理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例.
好的,听起来不错所以我决定检查生命周期管理器中的构建实现.我的结论:
TransientLifetimeManager - 没有处理处理.Container仅解析实例,并且不会跟踪它.调用代码负责处理实例.ContainerControlledLifetimeManager - 处理终身经理时的实例(=处置容器时).提供在层次结构中的所有容器之间共享的单例实例.HierarchicalLifetimeManager- 从中获取行为ContainerControlledLifetimeManager.它在hiearchy(子容器)中为每个容器提供"单例"实例.ExternallyControlledLifetimeManager - 没有处理处理.正确的行为,因为容器不是实例的所有者.PerResolveLifetimeManager - 没有处理处理.它通常是相同的,TransientLifetimeManager但它允许在解析整个对象图时重用实例来进行依赖注入.PerThreadLifetimeManager - 没有处理处理,如MSDN中所述.谁负责处置?内置的实现PerThreadLifetimeManager是:
public class PerThreadLifetimeManager : LifetimeManager
{
private readonly Guid key = Guid.NewGuid();
[ThreadStatic]
private static Dictionary<Guid, object> values;
private static void EnsureValues()
{
if (values == null)
{
values = new Dictionary<Guid, object>();
}
}
public override object GetValue()
{ …Run Code Online (Sandbox Code Playgroud)