我专门指的是Impersonating user with Entity Framework的可接受答案,它包含以下代码:

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


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

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

最佳答案

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

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

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

额外:

嵌套用法不重要。 Impersonate()是影响当前线程的状态更改。使用暗示的Dispose()将调用Undo()。

关于c# - 如何将基于“使用”的GC生命周期分解为基于“创建-处置”的生命周期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10199809/

10-15 17:25