正确使用实例级变量

时间:2015-01-05 03:00:20

标签: c# entity-framework

我有一个带有一些方法的对象访问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
  }
}

1 个答案:

答案 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; } }
}