[C#]static使用-讀取目前系統測試功能是否有開啟

摘要:[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.程式執行結果
OnTest="Off",原本的寄信功能

OnTest="On",寄測試信

 

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裡面,見人見智,各有優缺