一般在做大型網站,通常會寫一支程式,固定一段時間就跑一些工作,例如說上架商品或是寄電子郵件之類的。一般而言有些工程師會採取下列作法。

            string strArgs = "Task1";

            switch(strArgs)
            {
                case "Task1":
                    Task1();
                    break;
                case "Task2":
                    Task2();
                    break;
                case "Task3":
                    Task3();
                    break;
            }

這種作法就是根據參數值而決定要跑哪一個函式,這樣的好處在於程式很好寫,但缺點就是當工作的種類一多,switch case就會愈寫愈長,然後程式碼就愈來愈噁心。

其實可以採取更精簡的寫法來簡化程式碼,像是定義一個介面,然後一種工作的類型就定義一個類別,然後繼承該介面,程式碼如下:

namespace TaskConsoleApplication
{
    interface ITask
    {
        void Excute();
    }

    public class Task1 : ITask
    {
        public void Excute()
        {
            Console.WriteLine("Task1");
        }
    }

    public class Task2 : ITask
    {
        public void Excute()
        {
            Console.WriteLine("Task2");
        }
    }

    public class Task3 : ITask
    {
        public void Excute()
        {
            Console.WriteLine("Task3");
        }
    }
}

定義一個ITask,然後定義三個工作分別為Task1、Task2、Task3。

 

然後加入一個設定檔,定義什麼Key值對應到什麼類別。

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="Task1" value="TaskConsoleApplication.Task1"/>
    <add key="Task2" value="TaskConsoleApplication.Task2"/>
    <add key="Task3" value="TaskConsoleApplication.Task3"/>
  </appSettings>
</configuration>

 

接下來就利用ConfigurationManager類別來讀取設定,然後動態產生對應的物件。

            string strConValue = string.Empty;

            strConValue = ConfigurationManager.AppSettings["Task1"];
            Type type = Type.GetType(strConValue);
            ITask obj1 = Activator.CreateInstance(type) as ITask;
            obj1.Excute();

            strConValue = ConfigurationManager.AppSettings["Task2"];
            type = Type.GetType(strConValue);
            ITask obj2 = Activator.CreateInstance(type) as ITask;
            obj2.Excute();

            strConValue = ConfigurationManager.AppSettings["Task3"];
            type = Type.GetType(strConValue);
            ITask obj3 = Activator.CreateInstance(type) as ITask;
            obj3.Excute();

 

執行結果。

2012-04-14_023742

arrow
arrow
    全站熱搜

    卑微研究生 發表在 痞客邦 留言(0) 人氣()