Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.Net单例数据访问层_Asp.net_Asp.net Mvc 4 - Fatal编程技术网

Asp.Net单例数据访问层

Asp.Net单例数据访问层,asp.net,asp.net-mvc-4,Asp.net,Asp.net Mvc 4,我一直在玩MVC4,我已经创建了一个数据访问层,目前是一个单例 我的问题是,这是个好主意吗?我的层中有一个轮询方法,这是我将其设置为单例的主要原因(此轮询方法检查数据库,然后使用signalr更新UI) 我还认为使用单例缓存数据是个好主意,但我现在有点不确定,这个单例如何处理400个并发用户 任何帮助都会很好 代码- public class DataAccessLayer { private static DataAccessLayer _instance; public

我一直在玩MVC4,我已经创建了一个数据访问层,目前是一个单例

我的问题是,这是个好主意吗?我的层中有一个轮询方法,这是我将其设置为单例的主要原因(此轮询方法检查数据库,然后使用signalr更新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());
    }
}

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

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

您必须使用单例或静态类来处理线程问题。锁定有帮助,但它会使事情变得更慢,特别是因为您不检查实例是否已在锁定之前设置

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

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


为了便于单元测试/模拟,为具体类实现一个
IDataAccessLayer
接口,并将其用作控制器构造函数中的参数类型。

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