【问题标题】:should I use a static DbUtil class for web, is it dangerous?我应该为 web 使用静态 DbUtil 类,这很危险吗?
【发布时间】:2011-04-20 19:16:39
【问题描述】:

可以在网络上使用这样的东西吗: (我的应用程序在 asp.net mvc 上)

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

【问题讨论】:

  • 这完全取决于你如何调用这个方法。你能给我们举例说明它的用法吗?否则不可能说任何有用的东西。
  • @Steven 我已经编辑了我的问题

标签: asp.net asp.net-mvc ado.net data-access-layer


【解决方案1】:

使用这个静态类是绝对可以的,只要它像你的情况一样隐藏并包裹在存储库后面。这允许使用存储库的控制器逻辑与数据访问之间的耦合较弱。您展示的静态方法看起来很完美reentrant,这使它成为线程安全的。

【讨论】:

  • 好的,我的 IoC 也默认为每个 Repository 做一个单例,在 web 中可以吗?
  • 可以,只要您的存储库是可重入且线程安全的。但是,如果您使用自定义控制器工厂,请务必小心:静态控制器可能会破坏一切 :-) 另一方面,我更喜欢让我的存储库保持非单一状态,以避免有人弄乱代码并使其成为非线程安全的。坦率地说,与使用相比,对象实例化的价格可以忽略不计。
  • 好吧,你看到了我的存储库,它只是原始的 ado.net,没有调用 lock 或任何东西,这个线程安全吗?
  • @Omu,我只看到了一个小代码 sn-p 正如我在回答中所说的那样,它是完全线程安全的。因为我没有看到它们,所以我无法为您的存储库得出一般结论。
【解决方案2】:

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

但是,将方法设为静态似乎并没有真正让您获得太多收益。一般来说,您应该更喜欢实例方法而不是静态方法,因为在测试期间无法模拟静态方法调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多