我应该使用一个静态的DbUtil类为web​​,它是危险的吗?

问题描述:

是确定在网络使用这样的: (我的应用程序是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

使用这个静态类是绝对可以的,只要它隐藏在存储库后面,就像它在你的情况一样。这允许使用存储库的控制器逻辑与数据访问之间的较弱耦合。你已经显示的静态方法似乎很完美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

正如你所写的,你的静态方法没有并发性问题,因为它不会对任何共享数据进行操作,并且每个调用都会实例化它自己的本地连接和命令对象。

然而,从静态方法看,你并没有真正获得太多的东西。一般来说,你应该比静态方法更喜欢实例方法,因为静态方法调用在测试过程中不能被模拟出来。