将实体上下文传递给其他方法和对象
问题描述:
我想知道什么是在类之间传递上下文的最佳方式。我应该使用参考参数还是简单地将上下文作为参数传递?最好是构造函数,但在静态方法的情况下,最好的方法是什么?即性能,安全性,设计等等。在将上下文作为参数传递的过程中是否存在性能问题?如果不同的线程在使用引用的同时在上下文中工作,可能会发生冲突吗?将实体上下文传递给其他方法和对象
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
}
}
答
在这里完全没有必要使用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++中那样创建对象的副本。
当您将实体框架上下文作为普通参数传递时,没有问题或性能问题。只要确保它终于被处置。 – Andrei 2013-04-22 18:50:38
上下文类不是线程安全的,因此,如果您在多个线程中使用上下文,则无论使用或不使用'ref'修饰符传递它,都必须期望出现问题。您必须通过手动线程同步来确保线程安全(使用'lock'等)。如果你真的不需要它,你最好避免在不同的线程中使用上下文。 – Slauma 2013-04-22 18:59:28