将实体上下文传递给其他方法和对象

问题描述:

我想知道什么是在类之间传递上下文的最佳方式。我应该使用参考参数还是简单地将上下文作为参数传递?最好是构造函数,但在静态方法的情况下,最好的方法是什么?即性能,安全性,设计等等。在将上下文作为参数传递的过程中是否存在性能问题?如果不同的线程在使用引用的同时在上下文中工作,可能会发生冲突吗?将实体上下文传递给其他方法和对象

Main.cs

static void Main(string[] args) 
{ 
    var context = new MyEntities(); 

    var myClass = new MyClass(context); 
    myClass.AddPerson(); 
    // or 
    Person.AddPerson(ref context); 
} 

MyClass.cs

public class MyClass 
{ 
    public void MyClass(MyEntities context) { } 

    public void AddPerson() 
    { 
     context.People.AddObject(new Person()); 
    } 
} 

MySecondClass.cs

public partial class Person 
{ 
    public static AddPerson(ref MyEntities context) 
    { 
     // Do something 
    } 
} 
+0

当您将实体框架上下文作为普通参数传递时,没有问题或性能问题。只要确保它终于被处置。 – Andrei 2013-04-22 18:50:38

+3

上下文类不是线程安全的,因此,如果您在多个线程中使用上下文,则无论使用或不使用'ref'修饰符传递它,都必须期望出现问题。您必须通过手动线程同步来确保线程安全(使用'lock'等)。如果你真的不需要它,你最好避免在不同的线程中使用上下文。 – Slauma 2013-04-22 18:59:28

在这里完全没有必要使用ref。当传递对象时,你实际上是传递引用的副本(它本身是一个指向堆中对象的值类型)。使用ref关键字,您通过引用传递“引用值”(困惑了吗?)。这意味着参考实际上可以在函数的范围之外进行更改,这在任何情况下似乎都不实用,并且只是一个奇怪错误的机会。

ref关键字意味着你通过引用传递指针,所以改变变量的值将改变它的来电者。又名:

static void Main(string[] args) 
{ 
    var context = new MyEntities(); 
    Person.AddPerson(ref context); 

    // context is now null 
} 

呼吁:

public partial class Person 
{ 
    public static AddPerson(ref MyEntities context) 
    { 
     context = null; 
    } 
} 

在这种情况下,你不会是按引用传递。记住变量是一个指向对象的指针,所以简单地传递它就不会像在C++中那样创建对象的副本。