在这种情况下,asp.net中的静态方法是个坏主意

本文关键字:静态方法 这种情况下 asp net | 更新日期: 2023-09-27 17:58:09

我有一个DAL类,它类似于低于

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace SomeNameSpace
{
    public class DAL
    {
        public  string _ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["xClassConnectionString"].ConnectionString;
        public static DataSet GetDataSet(string sql)
        {
            try
            {
                using (SqlConnection connection2 = new SqlConnection(Convert.ToString(System.Configuration.ConfigurationManager.ConnectionStrings["xClassConnectionString"].ConnectionString)))
                {
                    SqlCommand cmd = new SqlCommand(sql, connection2);
                    SqlDataAdapter adp = new SqlDataAdapter(cmd);
                    //   Connection.Close();
                    DataSet ds = new DataSet();
                    adp.Fill(ds);
                    return ds;
                }
            }
            catch (SqlException err)
            {
                // Replace the error with something less specific.
                // You could also log the error now.
                throw new ApplicationException("Data error. " + err.Message.ToString());
            }
        }
        public static DataSet GetDataSet(string sql, Dictionary<string, dynamic> dictionary)
        {
            try
            {
                using (SqlConnection connection2 = new SqlConnection(Convert.ToString(System.Configuration.ConfigurationManager.ConnectionStrings["xClassConnectionString"].ConnectionString)))
                {
                    SqlCommand cmd = new SqlCommand(sql, connection2);
                    cmd.CommandType = CommandType.Text;
                    //Dictionary<string, dynamic> dictionary = new Dictionary<string, dynamic>();
                    foreach (KeyValuePair<string, dynamic> pair in dictionary)
                    {
                        cmd.Parameters.AddWithValue(pair.Key, pair.Value);
                    }
                    SqlDataAdapter adp = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    adp.Fill(ds);
                    return ds;
                }
            }
            catch (SqlException err)
            {
                // Replace the error with something less specific.
                // You could also log the error now.
                throw new ApplicationException("Data error. " + err.Message.ToString());
            }
        }

        public static DataTable GetDataTable(string sql)
        {
            DataSet ds = GetDataSet(sql);
            if (ds.Tables.Count > 0)
                return ds.Tables[0];
            return null;
        }

        public static int ExecuteSQL(string sql)
        {
            try
            {
                using (SqlConnection connection2 = new SqlConnection(Convert.ToString(System.Configuration.ConfigurationManager.ConnectionStrings["xClassConnectionString"].ConnectionString)))
                {
                    string BegSql = "BEGIN TRY BEGIN TRANSACTION ";
                    string EndSql = " COMMIT TRANSACTION END TRY BEGIN CATCH  ROLLBACK TRANSACTION END CATCH";
                    string NewSql = BegSql + sql + EndSql;
                    sql = NewSql;
                    SqlCommand cmd = new SqlCommand(sql, connection2);
                    connection2.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
            catch (System.Exception ex)
            {
                return -1;
            }
        }
    }
}

我还有一个BAL类,它包含的所有功能

using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.UI;
namespace SomeNameSpace
{
    public class BAL
    {
        public static int getUserID(string user_name)
        {
            try
            {
                //string sql = "select user_id from CI_Users where user_name=@user_name";
                string sql = "select user_id from CI_Users where user_name=1";
                return Convert.ToInt32(DAL.GetDataTable(sql).Rows[0][0]);
            }
            catch (System.Exception ex)
            {
                throw new ApplicationException("Data error." + ex.Message.ToString());
            }
        }
    }
}

我的问题是

将BAL中的所有函数都写为静态是个好主意还是坏主意?我会打电话给BAL做所有的操作。

public static int getUserID(string user_name)

在这种情况下,asp.net中的静态方法是个坏主意

设计BAL有两种方法1.无国籍2.状态完整

将方法作为静态成员是一种无状态设计——例如,你不能在类中的一个变量设置在一个方法中,然后在另一个方法中将其用于每次调用(当然,你也可以将其设置为静态成员,但它的值是全局的,不建议在web应用程序中使用)

此外,如果您想拥有一些交叉(如日志记录、事务…)代码,则必须拥有非静态成员和类。

顺便说一句,如果你正在开发一个小型应用程序,这是可以的,如果你在开发一个企业应用程序,请重新思考

在我看来,您当前的设计没有问题。当使用static类时,您应该开始担心的时刻是您希望保持变量的活力。

ASP.NET中的静态变量在会话中保留因此,当您将用户id保存在静态变量中时,可能会跨不同用户的会话。