2011-01-20 56 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?? 
相关问题