c# - 如何将基于 'using' 的 GC 生命周期打开为基于 'create-dispose' 的生命周期?

标签 c# .net asp.net-mvc-3

我特指 Impersonating user with Entity Framework 已接受的答案,其中包含以下代码:

using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
using (var dbContext = new MyEntityFrameworkContainer())
{
    ...
}

我宁愿仅在存储库中的一个位置实例化dbContext,它实现IDisposable,然后在处置实体时处置上下文。我不确定上面的两个 using 范围如何相互影响,那么如何在避免使用 block 的同时实现此代码在模拟方面的作用?

添加: 正如下面的答案所建议的,我可以简单地使用局部变量并“手动”确保资源被处置,但我在这里关心的是内部 using 中的实例化是否以任何方式受到外部 使用。如果这只是生命周期的问题,并且外部 using 没有建立任何上下文或影响内部的任何内容,那么下面的答案已经回答了我的问题。

最佳答案

您可以将它们声明为 2 个私有(private)字段并在构造函数中实例化它们。

然后实现Dispose()并以相反的顺序Dispose它们。

当然,调用代码(业务层)应该将 using(){} 模式应用于存储库实例。

附加:

嵌套使用应该不重要。 Impersonate() 是影响当前线程的状态更改。使用隐含的 Dispose() 将调用 Undo()。

关于c# - 如何将基于 'using' 的 GC 生命周期打开为基于 'create-dispose' 的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199809/

相关文章:

c# - Kentico TreeNode Delete 方法不删除依赖项

ajax - MVC3/Razor 到 Controller Ajax 调用

c# - ASP.NET 学习路径

asp.net-mvc-3 - 测试 RazorViewEngine View 的输出

c# - 处理我需要从我的方法返回的数据表对象

c# - WPF 删除选项卡不处理内容?

c# - 直到 socket.Close 才收到 Windows socket.Send 数据

c# - 容器放大时如何放大标签

c# - 批量大小如何影响批量插入性能?

.net - 在IL中初始化大量数据