2010-10-04 49 views
3

是確定在網絡使用這樣的: (我的應用程序是asp.net的MVC)我應該使用一個靜態的DbUtil類爲web​​,它是危險的嗎?

public static class DbUtil 
{ 
     public static int Insert(object o, string cs) 
     { 
      using (var conn = new SqlConnection(cs)) 
      using (var cmd = conn.CreateCommand()) 
      { 
       ... 

       conn.Open(); 
       return Convert.ToInt32(cmd.ExecuteScalar()); 
      } 
     } 
} 

用法:

public class Repository<T> : IRepository<T> 
{ 
     public virtual int Insert(T o) 
     { 
      return DbUtil.Insert(o, Cs); 
     } 
} 

,並在服務或控制器構造注射後

public MyController(
     IRepository<Organization> organizationRepository) 
    { 
     this.organizationRepository = organizationRepository; 
    } 
+0

這完全取決於你如何調用這個方法。你能給我們舉例說明它的用法嗎?否則,不可能說任何有用的事情。 – Steven 2010-10-04 13:06:20

+0

@Steven我編輯了我的問題 – Omu 2010-10-04 13:11:29

回答

2

使用這個靜態類是絕對可以的,只要它隱藏在存儲庫後面,就像它在你的情況一樣。這允許使用存儲庫的控制器邏輯與數據訪問之間的較弱耦合。你已經顯示的靜態方法似乎很完美reentrant這使得它線程安全。

+0

好吧,我的IoC默認爲每個存儲庫執行一個單身,它在網絡中可以嗎? – Omu 2010-10-04 13:23:02

+0

是的,只要您的存儲庫可重入且線程安全。但是,如果你使用自定義控制器工廠,要非常小心:靜態控制器可能會破壞所有的東西:-)另一方面,我更願意保留我的存儲庫非單身,以避免有人搞亂代碼並使其不是線程安全的。坦率地說,與使用情況相比,對象實例化的價格可以忽略不計。 – 2010-10-04 13:24:13

+0

好吧,你看到我的存儲庫,它只是原始的ado.net,沒有調用鎖或任何東西,它這個線程安全嗎? – Omu 2010-10-04 13:26:27

1

正如你所寫的,你的靜態方法沒有併發性問題,因爲它不會對任何共享數據進行操作,並且每個調用都會實例化它自己的本地連接和命令對象。

然而,從靜態方法看,你並沒有真正獲得太多的東西。一般來說,你應該比靜態方法更喜歡實例方法,因爲靜態方法調用在測試過程中不能被模擬出來。

相關問題