Asp.Net单例数据访问层
我一直在玩MVC4,我已经创建了一个数据访问层,目前是一个单例 我的问题是,这是个好主意吗?我的层中有一个轮询方法,这是我将其设置为单例的主要原因(此轮询方法检查数据库,然后使用signalr更新UI) 我还认为使用单例缓存数据是个好主意,但我现在有点不确定,这个单例如何处理400个并发用户 任何帮助都会很好 代码-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
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将管理数据库连接,因此不会对数据库资源的使用产生任何影响。感谢您的支持,也许我认为这会对性能产生很大影响,但我想不会。我想你已经从你的回答中引出了另一个问题:)