簡體   English   中英

在這種情況下,asp.net中的靜態方法是一個壞主意嗎?

[英]Static Method in asp.net on this scenario is a bad idea?

我有一個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)

我認為,您當前的設計沒有問題。 使用static類時,您應該開始擔心的時候就是要使變量保持活動狀態。

ASP.NET中的靜態變量通過會話保留。 因此,當您將用戶ID保存在靜態變量中時,這可能會跨越不同用戶的會話。

設計BAL有兩種方法:1.無狀態2.有狀態

使方法成為靜態成員是無狀態設計的一種,例如,您不能在類中為每個調用設置變量,而在每次調用時都將其用於另一種方法(當然,您也可以將其設為靜態,但是它的值是全局的,在Web應用程序中不建議使用)

同樣,如果您想使用一些交叉代碼(例如日志記錄,事務等),則必須具有非靜態成員和類。

順便說一句,如果您正在開發一個小型應用程序就可以了,如果您正在開發一個企業應用程序,請對此重新考慮

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM