问题标签 [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 投票
1 回答
37 浏览

javascript - Javascript中for循环的范围

考虑以下代码:

x仍然打印在控制台中。

这在 JSHint 中给了我警告,因为再往前几行我做了另一个循环,重新声明x

现在我知道 JSHint 不是圣杯,但有没有办法防止x泄漏?(假设这是正确的术语?

我试过了:

所以"use strict";不是要走的路。

我尝试更深入地确定它的范围(这让我感到困惑,因为它让我感到恶心):

更糟糕的是:

console.log调用 JSHint 的行上警告我x被使用超出范围和我正在重新声明的下一行 x

0 投票
1 回答
169 浏览

c# - Autofac 可以为每个接口做不同的实例范围吗?

假设我的引导代码中有这一行:

我想要这样,每当我使用时,container.Resolve<IMyType>()我都会得到一个新的MyType. 但是,如果我使用container.Resolve<IEnumerable<IMyTypeBase>>(),我不想要新实例。我想要所有已经创建的实例。Autofac可以做到这一点吗?

0 投票
1 回答
774 浏览

sfml - Rust (+SFML) - 如何在受生命周期参数限制时避免额外的对象构造?

目前,我正在使用rust-sfml( rsfml::graphics) 将像素绘制到屏幕上。(我只是从 Rust 和项目开始。)我将数据存储在一个 中Image,然后复制到一个Texture.

Texture用于创建一个Sprite<'s>; 这就是我的问题。我需要能够改变Texture,但 的类型Sprite<'s>似乎保证我不能做我想做的事。window.draw(&sprite)由于每次重绘窗口时我都需要能够调用,所以我Sprite每次都创建一个新的。

更可取的选择是将 与一起保留Sprite<'s>在 my中。由于'Sprite'有一个生命周期参数,它变成:struct RenderTexturestruct Render<'s>

我有一个方法Render

它改变了Render(通过编辑Texture)。现在,只要我尝试blit多次调用,就会遇到这个问题:

我认为,之所以会发生这种情况,是因为生命周期参数强制第一个Render调用blit的生命周期等于Render实例的生命周期(整个主函数)。

我怎样才能保留我的原件Sprite并继续能够改变容器?可能吗?

这是一个看起来很愚蠢且相当简单的示例:

(如果问题不清楚,请道歉。当我对这些概念不太熟悉时,很难表达。)

0 投票
1 回答
1165 浏览

c# - Autofac - 组件忽略生命周期范围内定义的依赖关系

我很可能在这里误解了一些东西,所以也许这里有一个简单的答案,但我目前正在摸不着头脑。

我有一个实现 IUnitOfWork 的 UnitOfWork 类(是的,我知道)。工作单元的构造函数采用 IPrincipalFactory。TResponder 是图表的顶层,它采用 IUnitOfWork。

我正在尝试将 ApplicationPrincipalFactory 注册为生命周期范围内的特定实例......它依赖于传递给 HandleAsync 函数的一些属性。我正在执行以下操作:

根据我读过的所有内容,在 BeginLifetimeScope(r => 中定义依赖项应该覆盖父容器绑定,所以当我调用 resolve 时,它​​应该整齐地排列在一起。

但是,我得到一个例外:

除了这种方法,我没有在任何地方注册 IPrincipalFactory 。IUnitOfWork 在外部范围内定义如下:

我还尝试在子容器中重新定义工作单元注册,以防通过在外部容器中注册而不是在生命周期中注册它是一个问题原因:

我不确定我错过了什么......有什么想法或建议吗?

0 投票
1 回答
979 浏览

c# - 具有每个请求生命周期范围的 ServiceStack 自托管应用程序

使用 ServiceStack 我一直在解决自托管 Web 应用程序中对象生命周期管理的问题。

我的要求:

  1. 需要每个请求对象的生命周期范围。
  2. 我正在使用 Castle Windsor IoC 和实现的 ServiceStack IoC 适配器。
  3. 我的应用程序使用基类 AppHostHttpListenerPoolBase (ServiceStack v4) 自托管
  4. 可能有一天我想在 IIS 上移动,因此它必须是灵活的。

一般问题:

Castle Windsor IoC 实现了自己的每个请求的生命周期策略,但它绑定到 http 模块,因此它仅适用于 IIS 托管的应用程序。因此,我必须实现我的自定义 IScopeAccessor(由 Castle Windsor 提供)来处理对象的生命周期。这里的问题是没有我可以用来绑定到当前请求的钩子。

给定

我必须实现 GetScope 方法。

有两个主要想法我无法完成:

[Threadstatic]的使用

在 MyScopeAccessor 我只是存储

如果尚未初始化,则在第一个 GetScope 之后创建新范围。

问题:

  1. 很难处置。处理 _currentLifetimeScope 的最佳方法是实现自定义 IServiceRunner(或从 ServiceRunner 继承)覆盖 AfterEachRequest 方法。但我不完全知道 AfterEachRequest 是否真的在请求线程中执行。
  2. 迁移到 IIS 可能会导致一些问题,因为据我所知,IIS 不能保证在广告和请求上下文之间进行不可更改的绑定。

IRequest 实例的使用

在 MyScopeAccessor 我只是存储

并在相应的自定义 ServiceRunner 方法(OnBeforeEachRequest、OnAfterEachRequest)中创建和处置当前生命周期范围。

问题:

  1. 我不知道如何从 GetScope 全局访问当前请求,MyScopeAccessor 对服务和请求一无所知。

此外,如果 ServiceStack 默认的 Funq IoC 解决了这个问题,也很有趣。

0 投票
1 回答
270 浏览

task-parallel-library - 将数据传递给在 Simple Injector 中使用 Execution Context Scope 生命周期注册的依赖项

有没有办法将数据传递给在 Simple Injector 中使用 Execution Context Scope 或 Lifetime Scope 注册的依赖项?

我的一个依赖项需要一段数据才能在依赖项链中构建。在 HTTP 和 WCF 请求期间,这些数据很容易获得。对于 HTTP 请求,数据始终存在于查询字符串中或作为Request.Form参数(因此可从 获取HttpContext.Current)。对于 WCF 请求,数据始终存在于OperationContext.Current.RequestContext.RequestMessageXML 中,并且可以被解析出来。我有许多命令处理程序实现,它们依赖于需要这条数据的接口实现,它们在 HTTP 和 WCF 范围的生活方式中运行良好。

现在我希望能够使用任务并行库执行这些命令中的一个或多个,以便它将在单独的线程中执行。将数据块移出到配置文件、类或任何其他静态工件中是不可行的。它最初必须通过 HTTP 或 WCF 传递给应用程序。

我知道如何使用 Simple Injector 创建一种混合生活方式,并且已经将其设置为混合 HTTP / WCF / 执行上下文范围(命令接口是异步的,并且返回Task而不是返回void)。我也知道如何创建一个命令处理程序装饰器,它将在需要时启动一个新的执行上下文范围。问题是,我不知道如何或在哪里(或者如果我可以)“保存”这段数据,以便在依赖链需要它来构建依赖项之一时可用。

可能吗?如果是这样,怎么做?

更新

目前,我有一个IProvideHostWebUri使用两个实现调用的接口:HttpHostWebUriProviderWcfHostWebUriProvider. 界面和注册如下所示:

所以最终,除非我采用这种方法,否则我的目标是创建该接口的第三个实现,然后依赖于某种上下文来获取 Uri(它只是从其他两个实现中的字符串构造的)。

@Steven 的答案似乎是我正在寻找的,但我不确定如何使ITenantContext实现不可变和线程安全。我认为它不需要一次性使用,因为它只包含一个Uri值。

0 投票
1 回答
1133 浏览

reference - Passing two objects, where one holds a reference to another, into a thread

I have two objects where the second one requires the fist one to outlive it because it holds a reference to the first one. I need to move both of them into a thread, but the compiler is complaining that the first one doesn't live long enough. Here is the code:

Playground

And the error:

I believe I understand what the error is telling me: that once the facade object is moved to the thread, the reference will no longer be valid. But I was unable to find a working solution to this problem, assuming I would like to keep the structures intact.

I asked this question on the Rust forums as well

0 投票
0 回答
330 浏览

c# - 使用 SimpleInjector 加载动态模块

我有一个 WPF 应用程序,它使用 Caliburn.Micro 并为不同类型的外壳提供框架。所有这些外壳都实现了接口IShell

作为一个例子,让我们以一个充当主机的主窗口和一个选项卡控件来承载不同的加载的 shell,每个 shell 一个选项卡。每个外壳都可以通过关闭选项卡来关闭。

目前它使用 MEF 来支持 IOC、组合(带有属性)和它的子容器。

在用户操作时打开一个外壳:他选择了一个存储插件信息和其他数据的文件。

基于此文件数据和一些固定类型(如报告),在框架中创建和托管外壳。

位于插件程序集中的所有组件和一些其他框架组件都应限定在外壳中,其他一些将是框架中的组件。

当用户关闭水龙头时,可以释放动态创建的范围。

由于框架目前负责创建插件外壳组件,并且需要将这些视图/视图模型添加到框架基础架构中

框架的 caliburn 引导程序如下所示

制造贝壳的工厂

在框架主视图模型中,工厂被称为

插件指定了他们需要的注册,这些注册也将是生命周期的。

调用var shells = m_factory.GetAll();失败,除非在有意义的范围之外请求范围服务。

阅读文档和示例后,我不确定如何使用 SimpleInjector 构建它。

使用 SimpleInjector 创建和管理子容器似乎是错误的方式。现在我有一种我错过了什么的感觉。

更新

是的,用户可以切换选项卡,可以关闭选项卡,看起来很像 VisualStudio,因此不可能有模式窗口。

用户在加载的屏幕上选择一个文件。接下来收集所有插件信息并与平台插件合并。现在我有一堆类型(视图模型,服务,...),标签内容是从这些类型构建的。

0 投票
1 回答
5099 浏览

c++ - 如何增加 std::shared 指针的所有权数

我有一个结构,它有一个指针作为成员:

我想在一个范围内初始化 ptr,然后能够在该范围之外使用它:

但是我必须稍后删除它,这很容易出错,我宁愿避免这样做。所以我想用std::shared_ptr.

  • 那么,我该怎么做呢?我应该如何将 shared_ptr 分配给 mystruct.ptr 以使所有权计数变为 2?我看到 get() 不起作用,因为它只是传递指针但不提供所有权,所以它被删除了。

  • 如您所见,这里的主要动机是延长寿命,因此我对其他做法持开放态度。也许我在这里使用 shared_ptr 的想法是错误的?

0 投票
2 回答
4610 浏览

rust - 如何在线程中使用静态生命周期?

我目前正在为 Rust (1.0) 中的生命周期而苦苦挣扎,尤其是在通过通道传递结构时。

我如何得到这个简单的例子来编译:

我得到:

我可以明白为什么会这样(line仅适用于一次迭代for),但我无法弄清楚这样做的正确方法是什么。

  • 正如编译器提示的那样,我是否应该尝试将 转换&str&'static str
  • 'static如果每一行都有一生,我会泄漏内存吗?
  • 我什么时候应该使用'static呢?这是我应该尽量避免的事情还是完全可以?
  • 有没有更好的方法String通过通道在结构中传递 s?

我为那些幼稚的问题道歉。我已经花了很长时间搜索,但我无法完全理解它。这可能是我的动态语言背景妨碍了:)

顺便说一句:是&input[..]为了将 aString转换为&str考虑好的?这是我能找到的唯一稳定的方法。