2015-01-05 59 views
0

我有一个访问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

这是通用的实例变量:这些必须在构造函数中初始化。 – Abhinav

+0

或者它可以通过使用构造函数注入并分配给实例变量 – failedprogramming

+0

太元,不理解这个问题。请告诉我代码。 – Aron

回答

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 
    } 
} 

较新的办法,走的是“新望” 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; } } 
}