2011-01-07 113 views
0

我使用的是asp.net mvc和實體framework.We有數據訪問層和業務層。現在,數據訪問完成了所有查詢,我需要在業務層類中創建一個dataccess對象。現在我不確定我是否應該只創建一個對象或每次都在本地實例化。下面是一個例子 -我應該每次創建一個新對象還是創建一個對象?

第一種方式 -

class Employee_Business 
{ 
    public Employees GetEmployee() 
    { 
     DataAccess dao= new DataAccess(); 
     return dao.GetEmployees(); 
    } 

    public Employee GetEmployee(int id) 
    { 
     DataAccess dao= new DataAccess(); 
     return dao.GetEmployee(id); 
    } 
} 

第二種方式 -

class Employee_Business 
{ 
    DataAccess dao; 
    public Employee_Business() 
    { 
     dao = new DataAccess() 
    } 

    public Employees GetEmployee() 
    { 
     return dao.GetEmployees(); 
    } 

    public Employee GetEmployee(int id) 
    { 
     return dao.GetEmployee(id); 
    } 
} 

也是另一個選項是我可以做一些在數據訪問層的靜態方法。在那種情況下,不會有實例化。但是我不知道它可能導致的問題。我也聽說過Singleton Pattern,但不知道這是否真的是這種簡單情況下的需求。我只想知道這種情況下的最佳做法。我相信大家都這樣做了,請賜教謝謝!

回答

1

如果我是你,我會做一些認真的閱讀了有關工作模式的單位。這應該照顧你的問題相當徹底:

Patterns of Enterprise Application Architecture: Unit of Work

它真正歸結爲每一組您通過數據訪問層進行操作的真正應該工作的單一單元的一部分。該工作單元將所有操作聯繫在一起,並確保一切都同步進行。

有很多在.NET中使用實體框架,你應該能夠適應,以滿足您的需求工作單元模式的例子。

1

你需要考慮的web應用程序是如何工作的。您的申請將被提供服務的多個請求,很可能同時進行,如果是這樣,你需要考慮你的類將如何使用:

  1. 如果該類執行只讀操作,你大概可以使用它作爲一個靜態實例而不用擔心線程管理。
  2. 如果該類執行操作,可以改變其內部狀態,那麼你需要確保,如果它是靜態的,它有mutexs /監視器/鎖在適當情況下確保原子操作是滿意的。
  3. 如果該類執行操作是改變其內部狀態,你也許可以使用它作爲一個靜態實例,而不必擔心線程管理。

當你設計你的類型,它的有用考慮這些情況。

1

每個請求都需要它自己的數據庫連接,作爲一個Web應用程序是多線程的。多個請求可以同時在不同的線程中運行,並且每個線程都需要它自己的數據庫連接。

(當然,線程實際上可以共享一個連接,但是這將是非常有限的,它只是更復雜的代碼。)

爲每個請求創建一個新的對象實例只是最簡單的解決方案。可以使用單例類或靜態方法,但是必須管理連接,以便每個請求仍然使用它自己的連接。

1

從您提供的兩個列表中,您應該使用第二個列表。對於每個查詢,您不需要新的連接(或上下文)(如果您在請求中多次查詢),但您應爲每個請求創建一個Employee_Business類的新實例。 (所以;沒有單身的連接...)

相關問題