【问题标题】:Asp.Net Singleton Data Access layerAsp.Net Singleton 数据访问层
【发布时间】:2013-01-09 00:11:40
【问题描述】:

我一直在使用 MVC4,我创建了一个数据访问层,目前是一个单例。

我的问题是,这是个好主意吗?我的层中有一个轮询方法,这是我将其设为单例的主要原因(此轮询方法检查数据库,然后使用信号器更新 UI)

我还认为使用单例是个好主意,这样我就可以缓存数据,但我现在有点不确定,这个单例如何处理 400 个并发用户?

任何帮助都会很棒!

代码-

  public class DataAccessLayer
{
    private static DataAccessLayer _instance;

    public static DataAccessLayer Instance
    {
        get
        {
            lock (_instance)
            {
                if (_instance == null)
                    _instance = new DataAccessLayer();

                return _instance;
            }
        }
    }

}

public class HomeController : Controller
{
    public ActionResult GetUsers()
    {
        return View(DataAccessLayer.Instance.GetUsers());
    }
}

【问题讨论】:

    标签: asp.net asp.net-mvc-4


    【解决方案1】:

    您将不得不处理单例或静态类的线程问题。锁定会有所帮助,但它会使事情变慢,尤其是因为您没有检查实例是否已经在锁定之前设置。

    另外,对代码进行单元测试也很困难。

    我建议使用构造函数在控制器中设置DataAccessLayer 的实例。可以使用 IoC 容器或自定义控制器工厂来创建类实例并将其传递给控制器​​。

    为了更容易进行单元测试/模拟,为具体类实现IDataAccessLayer 接口,并将其用作控制器构造函数中的参数类型。

    【讨论】:

    • 如果我使用构造函数注入,是否会为 100 个用户创建 100 个实例?
    • 是的,但除非您在数据访问对象构建期间做一些昂贵的事情,否则这应该不是问题。一旦控制器实例超出范围,垃圾收集器将拾取对象,因此额外的内存使用量将降至最低。数据库 API 将管理数据库连接,因此不会对数据库资源使用产生任何影响。
    • 感谢这位伙伴,也许我认为这会对性能产生很大影响,但我想不会。我想你已经从你的回答中产生了另一个问题:)
    【解决方案2】:

    在这种情况下,单例是不必要的。在这里使用 DataAccessLayer 作为静态类更合适:

    public class HomeController : Controller
    {
        public ActionResult GetUsers()
        {
            return View(DataAccessLayer.GetUsers());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2011-12-10
      • 2011-02-14
      • 2012-06-21
      • 1970-01-01
      • 2011-07-20
      • 2014-07-25
      • 2023-03-30
      • 2018-07-06
      相关资源
      最近更新 更多