2

私は特に、次のコードを使用するEntityFrameworkでユーザーを偽装するために受け入れられた回答を参照します。

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

リポジトリ内の1つの場所でのみインスタンス化dbContextして、を実装IDisposableし、エンティティが破棄されたときにコンテキストを破棄したいと思います。上記の2つのusingスコープが互いにどのように影響するかはわかりませんが、ブロックの使用を避けながら、偽装に関してこのコードが行うことをどのように実現できますか?

追加: 以下の回答が示唆しているように、ローカル変数を使用して「手動で」リソースが確実に破棄されるようにすることができますが、ここでの私の懸念は、内部のインスタンス化がusing外部の影響を受けるかどうかusingです。これが生涯の問題であり、アウターusingがコンテキストやインナーに影響を与えるものを確立していない場合、以下の回答が私の質問に答えています。

4

2 に答える 2

2

それらを2つのプライベートフィールドとして宣言し、コンストラクターでインスタンス化できます。

次に、Dispose()を実装し、それらを逆の順序で破棄します。

そしてもちろん、呼び出し元のコード(ビジネスレイヤー)は、using(){}リポジトリインスタンスにパターンを適用する必要があります。

追加:

ネストされた使用法は重要ではありません。Impersonate()現在のスレッドに影響を与える状態変化です。using-implied 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 に答える