【发布时间】:2012-01-25 07:48:58
【问题描述】:
这个问题之前可能已经发布过,但我找不到。
我写这种东西已经很久了,我坐下来写一些新的东西,然后开始打字,就好像它是我自己的模式一样。最近出现了一个项目,我发现自己正在查看自己的代码并开始思考它看起来有多臭。
BackgroundInfoIfYouCare
在这个特定的库中,我需要向用户发送电子邮件。到目前为止,有 13 封罐头电子邮件。
每封电子邮件都有自己的模板(我使用的是 Razor 解析器,因此模板是用 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 方法。
如果不使用反射,有没有更清洁的方法来连接它?
【问题讨论】:
标签: c# design-patterns switch-statement