此問題可能已發佈,但我找不到它。接口或switch語句,找到正確的模式
我一直在寫這類東西很久,我坐下來寫新的東西,只是開始輸入這個,就好像它是我自己的模式。最近一個項目出現了,我發現自己正在查看自己的代碼並開始考慮它看起來有多臭。
BackgroundInfoIfYouCare
在這個特定的圖書館,我需要發送電子郵件給用戶。到目前爲止,有13封電子郵件。
每封電子郵件都有它自己的模板(我使用的是剃刀分析器,所以模板是用cshtml編寫的)。 每個電子郵件模板都有一個字符串的名稱鍵。 每封電子郵件都有自己的EF4查詢,以基於「成員資格」實體和所有相關數據返回模型。
我有一個類接受一個字符串,它是一個電子郵件模板名稱鍵。
該方法將運行適當的查詢並獲取列表,獲取電子郵件模板。
將列表和模板傳遞給解析器,將每個成員關係合併到模板並返回列表電子郵件。
EndOfBackgroundInfoIfYouCare
所以真正的問題......這樣做的最好方法是什麼?
一種方法是隻使用一個開關
public List<Membership> Execute(string TemplateKey) {
switch (TemplateKey)
{
case "SomethingExpired":
QueryResult = new SomethingExpiredEmailQuery().ExecuteQuery();
break;
case "SomethingExpireIn30":
QueryResult = new SomethingExpireIn30EmailQuery().ExecuteQuery();
break;
case "FirstTimeLoginThanks":
QueryResult = new FirstTimeLoginThanksEmailQuery().ExecuteQuery();
break;
case "SecurityTraining":
QueryResult = new SecurityTrainingEmailQuery().ExecuteQuery();
break;
case ETC ETC ETC...
}
另一種方法是使用一個接口
IEmailQuery
void ExecuteQuery()
但是,如果使用的界面我仍然需要實例化Query類。它不會節省代碼,也不會使代碼更易於維護。
有了反思,我可以做一些事情,如使用模式命名所有電子郵件查詢: 電子郵件模板SecurityTraining的密鑰的查詢名稱爲SecurityTrainingEmailQuery,我可以使用反射來實例化和調用ExecuteQuery方法。
沒有使用反射,有沒有更清潔的方式來接線?
那麼,Jon的回答是類似的,只有這樣才能更先進,然後我纔會害怕;-) – Lindan 2011-12-21 14:07:03