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