2015-01-05 56 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; } } 
}