【发布时间】:2014-06-18 13:51:12
【问题描述】:
我的任务是为一个项目实施业务对象/数据访问层,并且必须同时期待成千上万的用户。 我一直使用单例来管理 DAL,但我从来没有考虑过它会如何同时处理这么多多个用户,所以我想问问它的正确用途。
我有:
public class UserDAL
{
private static UserDAL _userDAL = null;
//Private constructor
private UserDAL() { }
public static UserDAL GetInstance()
{
if(_userDAL == null)
{ _userDAL = new UserDAL(); }
return _userDAL;
}
//Example of a method
public User GetUsers()
{
IDataReader dataReader = ConnectionFactory.GetConnection().ExecuteSomeQuery("queryHere");
}
}
对于我的连接工厂,我认为这不是问题,尽管我确实读过最好将连接池留给 ADO.NET 本身:
public sealed class ConnectionFactory
{
private static string _connectionString = ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString;
//My connection interface
private static IConnection _connection = null;
public static IConnection GetConnection()
{
if(_connection == null)
{
//some checks to determine the type
_connection = new SQLConnection(_connectionString);
}
return _connection;
}
}
我也在 BO 中使用单例模式,虽然我认为没有必要:
public class UserBO
{
private static UserBO _userBO = null;
private static UserDAL _userDAL = null;
private UserBO() { }
public static UserBO GetInstance()
{
if(_userBO == null)
{
_userBO = new UserBO();
_userDAL = UserDAL.GetInstance();
}
return _userDAL;
}
//Example of a method
public User GetUser()
{
//Rules
return _userDAL.GetUsers();
//return UserDAL.GetInstance().GetUsers(); //or this
}
}
我这样做只是为了可以调用 UI/Presentation 层:
User someUser = UserBO.GetInstance().GetUser(1);
这对我迄今为止制作的应用程序很有效,但我猜这是因为同时没有太多用户。 我担心当第二个用户请求某些东西但已经有第一个用户在其中执行一些繁重的操作时,UserDAL 实例中会发生什么。
我应该把这个模式放到 BO/DAL 层中,只保留在 ConnectionFactory 中吗?如果我使用它,我会遇到什么问题吗?
【问题讨论】:
标签: c# .net design-patterns singleton