2011-01-20 54 views
2

我想盡量減少使用「使用」的實體框架連接上下文範圍,同時我想能夠注入一個上下文到我的班級。 我搜索互聯網上,但並沒有發現像我這樣的情況下,還是我只是做錯了什麼,反正這裏是代碼:使用語句;爲什麼我的領域沒有設置爲空?

[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()的類型。

第二次測試失敗,對象生命序列與之前相同。

我很困惑,因爲我認爲GetNewIFoo()會返回ifoo的引用,並且使用關鍵字只會在ifoo上調用dispose?

此外,有沒有什麼好的方法來控制上下文範圍,同時保持注入IContext的能力?

+1

(澄清的稱號,因爲在C#中的`using`關鍵字的兩個完全不相干的用途; * using語句*和*使用指令*) – 2011-01-20 09:44:55

+0

謝謝你那 – Yuan 2011-01-20 09:47:46

回答

7

調用Dispose()不清除引用(也不會執行垃圾回收)。它只是簡單地調用Dispose()方法,它可以(例如)關閉連接,文件等 - 取決於實現。一個對象可以是非空的並且仍然處置。有些對象允許您查看對象是否被丟棄;大多數不會。

通常,如果你是using的東西,你不會在別的地方寫這個變量(即你不會把它寫成某個字段的地方)。

4

含義如果using塊是在下一:

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

這是一樣的:

​​3210

foo所以不nullusing之後,但它佈置。


另外:

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

Assert.IsNull(ifoo); // so why reference should be null?? 
相關問題