问题标签 [lifetime-scoping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
819 浏览

java - 如何确定变量是否具有范围和生命周期?

我了解范围和生命周期是什么以及它们有何不同:

范围:变量的可见性,即哪些代码块可以引用该变量

Lifetime:变量的值将在内存中保留多长时间

我的问题是:在下图中,我们根据什么决定变量 x 有生命周期而不是作用域,而变量 b1 有作用域但没有生命周期?

在此处输入图像描述

0 投票
1 回答
15532 浏览

rust - 什么是非词汇生命周期?

Rust 有一个与非词法生命周期相关的RFC ,它已被批准在该语言中实现很长时间。最近,Rust 对这个特性的支持有了很大的提升,算是完整的了。

我的问题是:非词汇生命周期到底是什么?

0 投票
1 回答
2011 浏览

c# - 尝试了解生命周期范围在 IoC 中的含义(使用 Autofac)?

起初我确实秘密地假设我可以理解它,但是通过一些简单的例子Autofac,我似乎理解错了,这是我尝试过的代码:

通过运行测试它_test2(),您可以简单地检查两种方法中解析的实例。

所以通过上面的代码,我理解myServicein_test1myServicein_test2应该是不同的。因为我认为 in 的生命周期范围myService应该_test1在那个方法中,而 in 的生命周期范围也myService应该_test2_test2。所以我们在这里有2 个不同的范围,但不知何故,解析的实例myService是同一个。

那么您能否向我解释一下这个问题,lifetime scope 这里到底是什么意思?在同一个班级里?或者更大的东西?

0 投票
2 回答
93 浏览

rust - 本地拥有的参考被认为是借来的

我有一个带有Option<String>字段的结构类型。在我的可选类型的方法中,我想匹配该字段并将值提取到本地范围中。我知道我需要说服借用检查器不要丢弃我的结构类型中指向的内存;我不知道该怎么做。

对于上下文,这是一个明显错误的示例。

这个程序显然是错误的,因为我将内部的值移动x到本地范围内,这意味着当方法返回时它将被删除;但是,由于该结构比方法调用的寿命更长,因此该值仍然可以在其他地方访问,这将在出现错误后产生使用。

由于我想使用该Some()值而不丢弃它,我想我应该引用计数它。尝试二:

但是,尽管克隆了这些引用,但我仍然遇到借用错误。

除了clone物品本身,我真的没有任何追索权吗?

Playground 链接到明显错误的示例。

Playground 链接到引用计数的噩梦。

0 投票
0 回答
322 浏览

rust - 在哪里存储 TcpStream 以与 BufReader 和 BufWriter 共享

我正在尝试为具有自己的简单 TCP 协议的程序构建一个简单的客户端包。

大多数通信通过发送命令并立即读取单行响应来进行。有些命令需要读取多个响应。我一直在BufReader::read_line()阅读单行,但是当它读取太多时,这似乎会下降,第二个read_line()可能会丢失行的开头。

我的假设是我打算保持BufReader周围,以便它保持其内部状态。

我通过将引用传递给 the 来做到这一点TcpStreamBufReaderBufWriter我得到“借来的价值不会活得足够长”。我的问题是;我在哪里“存储”TcpStream它以使其寿命足够长?

我尝试了不同的迭代尝试将其存储streamConnection结构上,但我似乎无法让它工作。

这是代码的精简版本:

如果我取消注释注释掉的行,它就可以工作。

0 投票
2 回答
148 浏览

rust - 通用特征实现中的生命周期

我想制作一个类似于以下结构的特征(我的特定用例有点复杂,但这捕获了我遇到的问题和错误)。我遇到的问题是最后一个 impl 中有哪些生命周期。我想我需要将它们压缩到特征定义中,但我不确定如何。我怎样才能整理出生命周期以便编译?

Rust 游乐场代码链接

0 投票
1 回答
5773 浏览

asp.net-core - Mediatr 范围问题

我正在使用 Mediatr 处理来自队列的消息。我可以得到一个简单的例子来工作。但是,当我尝试将对象注入处理程序时遇到了问题

这仅在我注册IMyDependency为瞬态作用域时有效,但是当我将其注册为作用域生命周期时,它会因错误而失败

我需要能够注入具有作用域生命周期的依赖项。有没有人对此有解决方案。

我正在使用 .NET Core 依赖注入框架。设置如下

有任何想法吗?

0 投票
0 回答
1434 浏览

c# - AutoFac - 当组件解析为单例的依赖项时,InstancePerLifetimeScope 变为 SingleInstance

原来的:

摘要: 我在使用 Autofac 时遇到问题,其中注册为单例/“SingleInstance”的对象的依赖项注册为“InstancePerLifetimeScope”,在解决第一个单例后最终变成“单例” .

详细信息:我正在开展一个项目,将 Autofac(版本 #4.9.2)合并到负责运行后台任务的 Windows 服务中。在准备过程中,我尝试阅读所有涉及生命周期范围的内容。我的代码具有 Autofac 解析服务对象,其中每个服务都有自己的预期角色和功能,和/或有时与其他服务交互(目前没有循环依赖)。为此,我将这些服务注册为单例,然后按顺序解析/启动每个服务。通过将服务注册为单例,如果另一个服务依赖于已解析的服务,而不是实例化一个新服务 Autofac 返回已解析的服务。

我遇到的问题是,在某些情况下,服务具有依赖关系,当解决时,预计依赖关系将在整个服务中重用(我的示例是记录器)。但是,还期望每个服务中已解析的依赖项应该不同,因为每个服务的已解析依赖项可能具有不同的行为。为此,我将这些依赖项注册为“InstancePerLifetimeScope”。然而,当服务被解析时,注册为“InstancePerLifetimeScope”的服务依赖最终会出现在 Autofac 的根容器中,该根容器会为共享相同依赖的所有其他服务检索,而不是将依赖解析为新对象。

示例:我在下面放置了一个简化示例,该示例类似于我的代码,它复制并概述了问题是如何受到影响的。

结论:我希望当一个对象注册为“InstancePerLifetimeScope”时,无论它被解析的对象是否注册为“SingleInstance”,它都将始终绑定到当前子范围。但是,似乎已解决的依赖项被放置在根范围内。

我可以做些什么来强制“InstancePerLifetimeScope”注册依赖项与为“SingleInstance”解析的对象完全相同,因此这些依赖项不会最终出现在根容器中并被其他服务重用?

编辑 2019 年 8 月 5 日:

来自指向Captive Dependencies主题的John King链接,我已经审查了该主题并同意我的问题属于强制依赖的领域。然而,我对此事的处理方式感到惊讶,因为强制依赖只是作为所有 IOC 库中的一个已知问题存在,而且似乎几乎没有希望讨论不同的解决方案来缓解更新中的问题。尽管如此,我仍然认为我遇到的问题与 Autofac 文档中概述的示例以及 AutoFac 引用的有关此问题如何发生的其他资源有所不同。我对这个论点的推理是,我认为这里真正的问题源于“InstancePerLifetimeScope”,所以我想知道这是否保证了另一种解决方案的可能性。

Autofac 给出的示例和Mark Seemann 博客文章的链接(这是理解强制依赖的好资源,只是有一个不好的例子),尝试显示一个发生的单例的强制依赖,该单例具有注册为“实例”的依赖每个依赖项”。问题是这个例子(如下所示)在指出实际问题时是错误的。“ProductService”注册为单例,因此在第一次解析后,它将始终返回相同的“ProductService”引用,示例暗示的情况并非如此。

AutoFac Doc 链接的示例不正确

从上面的代码中可以看出,对于“每个依赖的实例”注册,可能会发生强制依赖,如下面的示例所示,情况并非如此。

实际发生的事情的例子

这意味着只有当您尝试注册一个类的生命周期以驻留在它被解析的当前范围或更大/父范围内时,才会发生强制依赖。

其他人的建议是,仅将单例的依赖项按依赖项注册实例不会有很大的不同,但是,我认为这忽略了重点。在某些情况下,重用相同的依赖项很重要,我使用记录器作为一个主要示例,其中具有多个分辨率可能会导致争夺外部资源,例如记录数据的位置。更重要的是,大多数这些强制依赖问题都可以通过避免注册单例来避免,就好像您在子范围内的共享至少可以关闭孩子一样,但是对于单例,依赖关系被捕获在根目录中。然而我认为,如果我们不使用像 Autofac 这样的 IOC 库并自己手动传递它们,那么这些依赖关系可以按照我们的需要解决,而无需捕获依赖关系,所以从逻辑上讲,如果我们可以,AutoFac 应该可以做到这一点。但是,我希望 Autofac 为我完成这项工作,但这是一个很大的陷阱,我认为大多数人在查看 IOC 库时应该意识到这一点。

问题: 我读过更新 Autofac 以解决共享注册组件的这个问题很难编程,但 Autofac 真的很难知道注册为跨范围共享的单例依赖项应该驻留在仅表示当前范围,而不是 Singleton 所在的根范围?我敢说,当一个单例实例被解析时,实例的依赖项不需要驻留在根范围内以使单例实例存在,因为它们将由于它们在单例实例中的引用而存在于内存中,因此没有根范围保存这些依赖项的原因。

如果情况确实如此,唯一的途径似乎是永远不要在 AutoFac 中使用 Singleton 功能,并找到另一种解决方法。也就是说,我认为AutoFac 文档的 Singleton 部分中应该有一个关于这个问题的巨大警告,目前缺少该部分。

0 投票
2 回答
229 浏览

rust - 对于不带任何参数的方法来说,显式生命周期有什么意义?

Programming Rust的第 295 页上,您可以找到以下内容:

幸运的是,标准库包含一揽子实现:

我对&'a那里的使用感到困惑。那是什么背景?它既没有用于 的参数,as_ref也没有与 . 的输出相关联&U。在这种情况下使用时,我认为我并不完全理解生命周期。

我查了这个,因为我仍然不明白,答案仍然没有点击(有意义)。我发现convert.rs。这似乎在任何地方都没有任何生命周期,但它实现了这个AsRef特征。那么为什么这本书有这个,而不是 Rust 中的实际代码呢?在哪里可以找到书中提到的“一揽子实施”?

0 投票
2 回答
149 浏览

wpf - 在 WPF 应用程序中获取 Autofac 最内部范围

如何在 WPF 应用程序中获取最里面的 autofac 范围或命名范围?我需要这个,因为我使用 MarkupExtension 来解析 VM。所以在我的 MarkupExtension 中,我需要当前的(最里面的)Lifetimescope。

谢谢