摘要:[C#]static使用-讀取目前系統測試功能是否有開啟
一、前言
這兩天公司職能系統的稽催信功能,主要需求,如果公司人員在職能填寫期限內沒有填寫,系統人員就要寄給所有要填寫但又沒填的人
只是,功能在測試時,總不能一直寄信給公司的人員(寄到大老闆就完了…Good Luck...),所以做了一個開關功能,如果目前是測試狀態,則寄給測試人員,反之就照原本的功能。
撰寫這篇的主要重點在於static的使用,而不是mail的設定或是WebConfig,下面再慢慢帶出
二、本文
1.WebConfig
onTest="On"-->代表測試功能開啟,off或其它就是關閉
2.TestSetting
用來讀取webconfig的設定,onTest="On"回傳true,其它回傳false
也是這次要分享的重點
///
/// 取得webconfig設定
///
public class TestSetting
{
public static String start = "On";//測試啟動的判別字串
///
/// 是否開啟測試功能,onTest="On"回傳true,其它回傳false
///
///
public static Boolean isTest()
{
String onTest = "";
onTest=System.Configuration.ConfigurationManager.AppSettings["onTest"];
if (onTest == null)
{
return false;
}
if (onTest.Trim().Equals(start))
{
return true;
}
else
{
return false;
}
}
}
3.Mail.cs
email內容的設定,以及假裝有寄信功能,
在SendMail()中會呼叫SetMailTo()、SetMailFrom()、 SetCC()、SetSubject()、 SetBody(),SetCC跟SetSubject內容為空
如果測試功能有開啟,會透過SetMailTo()、SetMailFrom()、SetBody(),改變寄件者、收件者以及內容
public class Mail
{
protected readonly Boolean _isTest = TestSetting.isTest();
///
/// 收件者
///
public String _mailTo = "";
///
/// 寄件者
///
public String _mailFrom = "";
///
/// 副本
///
public String _CC = "";
///
/// 主旨
///
public String _subject = "";
///
/// 內文
///
public String _body = "";
///
/// 收件人設定
///
/// CreateDate:2014/6/19 上午 11:00
/// CreateUser:Andrew.chen
public void SetMailTo()
{
if (_isTest)
{
_mailTo = "測試人員";
}
}
///
/// 寄件人設定
///
/// CreateDate:2014/6/19 上午 11:00
/// CreateUser:Andrew.chen
public void SetMailFrom()
{
if (_isTest)
{
_mailFrom = "測試人員";
}
}
///
/// 副本設定
///
/// CreateDate:2014/6/19 上午 11:01
/// CreateUser:Andrew.chen
public void SetCC()
{
//目前無功能
}
///
/// 主旨設定
///
/// CreateDate:2014/6/19 上午 11:01
/// CreateUser:Andrew.chen
public void SetSubject()
{
}
///
/// 內容設定
///
/// CreateDate:2014/6/19 上午 11:01
/// CreateUser:Andrew.chen
public void SetBody()
{
if (_isTest)
{
_body = "測試信件";
}
}
///
/// 假裝寄信功能
///
///
public String SendMail()
{
SetMailTo();
SetMailFrom();
SetCC();
SetSubject();
SetBody();
String mailContent = "";
mailContent += "寄件人為:" + _mailFrom + ";收件人為:" + _mailTo + " " + _body;
return mailContent;
}
}
4.SendMail.aspx、SendMail.aspx.cs
系統執行頁面
protected void send_Click(object sender, EventArgs e)
{
sendMessage.Text = "";
//模擬取得收件人員清單
String[] mailToUsers = {"user1","user2","user2" };
List mailList = new List();
foreach (String mailTo in mailToUsers)
{
Mail singleMail = new Mail();
singleMail._mailTo = mailTo;
singleMail._mailFrom = "系統人員";
singleMail._body = "正式信";
mailList.Add(singleMail);
}
String sendContent="";
foreach (Mail singleMail in mailList)
{
sendContent += singleMail.SendMail()+"
";
}
sendMessage.Text = sendContent;
}
5.延伸問題
最後在TestSetting中onTest=System.Configuration.ConfigurationManager.AppSettings["onTest"];這段執行了三次
原因在於,Mail這個class每New一次就會呼叫TestSetting.isTest(),在這個範例上,因為收件人只有三個,所以就執行了三次
如果收件人有1000個就會執行1000次,如果把它想像成去資料庫撈資料的話,相當於撈1000次...
6.解決方法
在isTest外再設一個static的變數,再指給onTest即可,isTest還是會呼叫3次,但是讀webconfig的動作就只有一次而已
三、後記
1.這個現象,是我在debug的時候偶然發現的,不知道這樣的思路以及解決方法是否正確,也希望有來看的不管是前輩或是後進,也協助我驗證
2.像這種開關的設定,之前碰到的經驗,有些人會特地開一個table去紀錄,不過也有人是寫在code裡面,見人見智,各有優缺