[英]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.