我有一个带有一些方法的对象访问EntityFramework实体,在更新之前用它来更新对象中的字段(保存到数据库中) 由于多个方法都在使用EF对象,因此我将实体设置为实例级变量,以便所有人都可以使用它。
问题是在使用Entity变量之前必须创建它。目前处理得很好,因为对象有一个公共方法,它在开始时创建实体。
我试图弄清楚实例级变量的使用是否正确,或者是否有更好的处理方式。当前这种做法的问题是,在该项目上工作的下一个人是否在创建变量之前调用该变量。
public class TestClass{
private EntityObject entObject;
public void DoSomething{
InitObject();
DoSomethingElse();
}
private void InitObject(){
//initialise the entity object here
}
private void DoSomethingElse(){
//do things here, which use the entObject
}
}
答案 0 :(得分:0)
这种情况的通常老派模式是提供EnsureXXX()
方法,然后从需要初始化的每个位置调用它。例如:
class A
{
private B _b;
private void EnsureB()
{
if (_b == null)
{
_b = new B(); // or whatever;
}
}
public void Method1()
{
EnsureB();
// Do stuff with _b
}
public void Method2()
{
EnsureB();
// Do stuff with _b
}
public void Method3()
{
EnsureB();
// Do stuff with _b
}
}
更新的方法,利用&#34; newish&#34; Lazy<T>
类看起来像这样:
class A
{
private readonly Lazy<B> _b = new Lazy<B>(() => new B());
public void Method1()
{
B b = _b.Value;
// Do stuff with b
}
public void Method2()
{
B b = _b.Value;
// Do stuff with b
}
public void Method3()
{
B b = _b.Value;
// Do stuff with b
}
}
在Lazy<T>
版本中,Value
属性最终履行了EnsureXXX()
方法的职责。
道路中间版本显式执行延迟初始化,但将值封装在属性中:
class A
{
private B _b;
private B B
{
get
{
if (_b == null)
{
_b = new B();
}
return _b;
}
}
public void Method1()
{
// Do stuff with B
}
public void Method2()
{
// Do stuff with B
}
public void Method3()
{
// Do stuff with B
}
}
您甚至可以混合搭配Lazy<T>
和属性方法:
class A
{
private readonly Lazy<B> _b = new Lazy<B>(() => new B());
private B B { get { return _b.Value; } }
}