我有一个网络应用程序,你已经知道这个应用程序将有很多请求,每个请求将在不同的线程上运行,这意味着如果我使用单例来访问我的DAL库,那将不会有问题。
但是我不确定这是最好的方法,因为我读过一个请求我有时会使用不同的线程,而且我还读到锁定线程有时会在使用单个实例时导致性能损失。
让你更好地了解我这是我打算做的事情:
DAL< - SingleInstance< - BAL< - SingleInstance< - Controllers< - Views
这是一个好方法吗?
这是我打算使用的单身人士:
public static Products Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Products instance = new Products();
注意:我的Dal将使用ADO.NET访问数据库(我有理由使用ado),BAL只会使用此方法进行选择或CRUD操作。
我的Ado.NET代码:
public static readonly string ConnectionString = @"Server=localhost;Database=test;Uid=root;Pwd=test;";
public bool IsProduct(string name)
{
var conn = new SqlConnection(ConnectionString);
bool result;
try
{
conn.Open();
var command = new SqlCommand();
SqlParameter[] parameters = new SqlParameter[1];
parameters[0] = new SqlParameter("@Product", name);
command.Connection = conn;
command.CommandText = "SPC_GET_PRODUCT";
command.CommandType = System.Data.CommandType.StoredProcedure;
result = Convert.ToBoolean(command.ExecuteScalar());
}
finally
{
conn.Close();
conn.Dispose();
}
return result;
}
感谢。
答案 0 :(得分:3)
一般情况下,由于以下几个原因,这可能不是一个好主意:
对于任何复杂的事情,Singleton很难用于多个线程。您调用的大多数库(如实体框架)不太可能是线程安全的,因此您需要进行大量锁定以保护资源。
您几乎肯定会在性能方面等待锁定,而不是仅仅创建服务层的新实例。如果每个人都在等待单个数据库上下文,那么拥有一个完全异步的平台是没有意义的。
他们很难进行单元测试
语义不正确。 Singleton的意思是只有一个类的实例。在某个时间只运行业务逻辑的一个实例是没有意义的。
Singleton可用于处理简单的事情,例如访问配置数据,或者创建实例时非常昂贵。但在几乎所有其他情况下,都有更好的方法。
有other answers解释了Singleton的所有问题。