2011-01-20 10 views
2

私は自分のクラスにコンテキストを挿入できるようにするために、「使用」を使用してエンティティ・フレームワークの接続コンテキスト・スコープを最小化しようとしています。 私は、インターネット上で検索が、私のようなケースを見つけられませんでしたか、私は何か間違ったことをやって、とにかく、ここでのコードは次のとおりです。;私のフィールドがnullに設定されていないのはなぜですか?

[TestFixture] 
public class Dummy 
{ 
    private IFoo ifoo; 
    [Test] 
    public void CreateIfNotExist() 
    { 
    using (var foo = GetNewIFoo()) 
    { 
     foo.Dosomething(); 
    } 
    Assert.IsNull(ifoo);//test fail here 
    } 

    [Test] 
    public void NotCreateIfExist() 
    { 
    ifoo = new Bar(); 
    using (var foo = GetNewIFoo()) 
    { 
     foo.Dosomething(); 
    } 
    Assert.IsNull(ifoo);//test fail here 
    } 

    private IFoo GetNewIFoo() 
    { 
    if (ifoo == null) 
    { 
    ifoo = new Foo();//return new Foo(); 
    } 
    return ifoo; 
    } 
} 

最初のテストがfoo created-> FOOのオブジェクトの配列を用いて、失敗しました何か - > fooが(fooを使って呼び出されて)呼び出されますが、ifooの状態変数はFoo()の型です。

2回目のテストに失敗しました。以前のオブジェクトライフシーケンスと同じです。

私はGetNewIFoo()がifooの参照を返し、キーワードを使用するとifooでdisposeを呼び出すと思っているので混乱しますか?

また、IContextを注入する機能を維持しながらコンテキストスコープを制御する良い方法はありますか?

+1

( 'using'キーワードの2つの完全に無関係な用途がCであるとして#、タイトルを明確化; * *文を使用してディレクティブを使用して*と*) –

+0

をいただき、ありがとうございますその – Yuan

+0

雅、最初のアイデアは、私は元のタイトルを見た "それはすぐに正確な重複のために閉じられる"です。しかし、確かに質問は私が思ったものではありません。 –

答えて

7

Dispose()を呼び出すと、参照番号(ガベージコレクションは実行されません)がクリアされません。単に、Dispose()メソッドを呼び出します。このメソッドは、実装に応じて(たとえば)接続、ファイルなどを閉じることができます。オブジェクトはnullでなくても処理できます。一部のオブジェクトでは、オブジェクトが破棄されているかどうかを確認できます。ほとんどはしません。

通常、あなたがusingの場合は、その変数を別の場所に書き込まない(つまり、どこかのフィールドとして書き込まない)。同じである

using (var foo = GetNewIFoo()) 
{ 
    foo.Dosomething(); 
} // foo.Dipose() will be called automatically 

4

usingブロックが次である場合に意味

​​3210

そうfoousingnullないが、それが配置されています。

また

using (var foo = GetNewIFoo()) 
{ 
    foo.Dosomething(); 
} 
//^ nothing below affects ifoo!! 

Assert.IsNull(ifoo); // so why reference should be null?? 
+0

それは良い点ですね、それから、私はEFコンテキストの接続を再開するのが難しいです – Yuan

+0

@元:いくつかのコードを投稿してください。おそらく新しく作成された質問で。 (前に答えを承認する)。 – abatishchev

+0

あなたとマークはすべて正しいですが、マークは1秒前にアイデアを指していました:Pありがとうございます。 – Yuan

関連する問題