此问题可能已发布,但我找不到它。接口或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