- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我知道类似的问题被问过好几次(例如:here、here、here 和 here),但它是针对以前版本的 Unity,答案取决于使用的 LifetimeManager
类。
文档说:
Unity uses specific types that inherit from the LifetimeManager base class (collectively referred to as lifetime managers) to control how it stores references to object instances and how the container disposes of these instances.
好的,听起来不错,所以我决定检查生命周期管理器中构建的实现。我的结论:
TransientLifetimeManager
- 不处理处置。容器只解析实例,不跟踪它。调用代码负责处理实例。ContainerControlledLifetimeManager
- 在处理生命周期管理器时(= 在处理容器时)处理实例。提供层次结构中所有容器共享的单例实例。HierarchicalLifetimeManager
- 从 ContainerControlledLifetimeManager
派生行为。它为层次结构(子容器)中的每个容器提供“单例”实例。ExternallyControlledLifetimeManager
- 不处理处置。正确的行为,因为容器不是实例的所有者。PerResolveLifetimeManager
- 不处理处置。它通常与 TransientLifetimeManager
相同,但它允许在解析整个对象图时重用实例进行依赖注入(inject)。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()
{
object result;
EnsureValues();
values.TryGetValue(this.key, out result);
return result;
}
public override void RemoveValue()
{ }
public override void SetValue(object newValue)
{
EnsureValues();
values[this.key] = newValue;
}
}
因此处置容器不会处置使用此生命周期管理器创建的一次性实例。线程完成也不会处理这些实例。那么谁负责释放实例呢?
我尝试在代码中手动处理已解析的实例,但我发现了另一个问题。我无法拆除该实例。生命周期管理器的 RemoveValue 是空的——一旦实例被创建,就不可能从线程静态字典中删除它(我也怀疑 TearDown
方法什么都不做)。因此,如果您在释放实例后调用 Resolve
,您将获得已释放的实例。我认为在将此生命周期管理器与线程池中的线程一起使用时,这可能是个大问题。
如何正确使用这个生命周期管理器?
此外,此实现经常在自定义生命周期管理器中重用,如 PerCallContext、PerHttpRequest、PerAspNetSession、PerWcfCall 等。只有线程静态字典被替换为其他构造。
此外,我是否正确理解处理一次性元素取决于生命周期管理器?因此应用程序代码依赖于使用的生命周期管理器。
我读到在其他 IoC 容器中处理临时一次性对象是由子容器处理的,但我没有找到 Unity 的示例 - 它可能可以用本地范围的子容器和 HiearchicalLifetimeManager
处理,但我'我不确定该怎么做。
最佳答案
只有少数情况下 Unity 会释放一个实例。实在是不支持。我的解决方案是实现此目的的自定义扩展 - http://www.neovolve.com/2010/06/18/unity-extension-for-disposing-build-trees-on-teardown/
关于c# - Unity 2.0 和处理 IDisposable 类型(尤其是使用 PerThreadLifetimeManager),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129789/
在撰写本文时,Unity 有一个名为 Unity LTS 2017.4.12f1 的版本,Unity 的最新版本是 2018.2.11 我知道 Unity LTS 应该是稳定版本,但这是否意味着 Un
我需要 Unity 来捕获所有按键,即使 Unity 没有焦点。 我尝试过使用: Input.KeyPress() 但这似乎只有在 Unity 拥有用户输入焦点的情况下才有效。我需要它在没有焦点时工作
我正在尝试统一实现一个TCP服务器。我正在使用 unity pro 3.5,当我在场景中运行此代码时,unity 挂起,完全没有响应,直到我用任务管理器杀死它。 using UnityEngine;
我想问一下,使用新的unity ads 2.0与unity ads相比,收入有什么区别 Unity Ads Unity Ads 2.0 最佳答案 Unity 广告支持 Unity 4.2.2 或更高版
当我运行我的应用程序时,我希望 Unity 打开两个窗口。 window 将有不同的摄像头,但两者都会看到同一个世界。 这样的事情可能吗? (我还没有找到任何证据表明这一点) 我知道我可以通过两个 U
我使用Unity Hub下载了最新的Unity编辑器,它对于编辑器、文档和语言包运行良好,但无法下载android构建支持。刚刚告诉我这两天下载失败很多次。 所以我从网页下载了UnitySetup-A
我使用Unity Hub下载了最新的Unity编辑器,它对于编辑器、文档和语言包运行良好,但无法下载android构建支持。刚刚告诉我这两天下载失败很多次。 所以我从网页下载了UnitySetup-A
我今天已将我的项目升级到 Prism 6.3.0 和 Unity 5.3.1。在此之前,我有 Prism 5 和 Unity 4。 现在我遇到了 Prism.Unity.UnityBootstrapp
Unity 中是否有与 StructureMap 中的 Registry 类等效的内容? 我喜欢考虑一个层/组件/库来自行配置它 - 从而填充容器。所以“父”层只需要知道注册类。 最佳答案 不,没有。
我似乎无法在任何地方找到 Microsoft.Practices.Unity.StaticFactory.dll。 还有其他注册静态工厂的方法吗? 寻找这样的东西 container.Register
是否可以统一尝试所有已定义的构造函数,从参数最多的构造函数到最不具体的构造函数(默认构造函数)? 编辑 我的意思是说: foreach (var constructor in concrete.Get
我有一个正在运行且运行良好的 Unity 应用程序,但我们目前正在通过对所有编译警告采取行动来清理我们的代码。 由于过时的 Microsoft.Practices.Unity.Configuratio
我正在使用 Visual Studio Code 在 Unity 中编写脚本。在“编辑”-“首选项”-“外部工具”-“外部脚本编辑器”下,我也选择了 VS Code。 打开脚本工作正常,但是当我尝试通
因此,我很确定这不是提出此类问题的正确论坛,因此我非常感谢有人将我链接到针对此问题的更好论坛(如果需要)。 我的问题: 在 Unity Hub 中,我进行了设置,以便 Unity 编辑器应下载到我的硬
问题:即使在 Cardboard 相机范围内,我也无法在任何地方看到我的 UI 文本。 截图: 我使用的是Unity 5.4.0b21版本,有人说可以通过降级到Unity 5.3版本来修复。 但是,我
我正在开发一个 Unity 项目,我正在使用 Google VR SDK for Unity 和 FirebaseMessaging.unitypackage 适用于 Unity 的 Firebase
好吧,在谷歌、这里和几个 ASP/MVC 论坛上搜索之后,我一定要问我到底做错了什么。 我的应用程序有一个良好的开端,对 DI、IoC 有很好的理解,并且正在使用 Repository、Service
我们最近将项目中的 Microsoft Unity 从 3.5.1404 版本升级到 5.8.6。在我们的代码中只做了一些小的调整,这次升级似乎很容易。它毫无问题地解决了我们所有注册的实例。但是,我们
我正在弄清楚使用 Unity 应用程序 block 时的意外行为。我有项目 A 作为我的启动项目。 项目 A 具有对项目 B 的项目引用,而项目 B 具有对项目 C 的项目引用。 项目 A 使用 un
我将 Unity 与 MVC 和 NHibernate 结合使用。不幸的是,我们的 UnitOfWork 驻留在不同的 .dll 中,并且它没有默认的空 .ctor。这是我注册 NHibernate
我是一名优秀的程序员,十分优秀!