一般在做大型網站,通常會寫一支程式,固定一段時間就跑一些工作,例如說上架商品或是寄電子郵件之類的。一般而言有些工程師會採取下列作法。
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();
執行結果。
全站熱搜
留言列表