2

我专门参考Impersonating user with Entity Framework的公认答案,其中包含以下代码:

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

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

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

4

2 回答 2

2

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

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

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

额外的:

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

于 2012-04-17T22:07:53.203 回答
1
var id = ((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate();
//store id
//do whatever you want, for example store this variable in a field
id.Dispose(); //remove impersonation
于 2012-04-17T22:00:44.863 回答