使用MVC访问库时,使用单例模式是个好主意吗?

时间:2015-03-30 14:44:34

标签: c# asp.net-mvc design-patterns singleton 3-tier

我有一个网络应用程序,你已经知道这个应用程序将有很多请求,每个请求将在不同的线程上运行,这意味着如果我使用单例来访问我的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;
    }

感谢。

1 个答案:

答案 0 :(得分:3)

一般情况下,由于以下几个原因,这可能不是一个好主意:

  • 对于任何复杂的事情,Singleton很难用于多个线程。您调用的大多数库(如实体框架)不太可能是线程安全的,因此您需要进行大量锁定以保护资源。

  • 您几乎肯定会在性能方面等待锁定,而不是仅仅创建服务层的新实例。如果每个人都在等待单个数据库上下文,那么拥有一个完全异步的平台是没有意义的。

  • 他们很难进行单元测试

  • 语义不正确。 Singleton的意思是只有一个类的实例。在某个时间只运行业务逻辑的一个实例是没有意义的。

Singleton可用于处理简单的事情,例如访问配置数据,或者创建实例时非常昂贵。但在几乎所有其他情况下,都有更好的方法。

other answers解释了Singleton的所有问题。