这个问题可能已经发布过,但是我找不到。
我一直在写这种东西已经很久了,我坐下来写一些新的东西,然后开始键入它,就像它是我自己的模式一样。最近出现了一个项目,我发现自己正在查看自己的代码,并开始考虑它看起来有多臭。
BackgroundInfoIfYouCare
在这个特定的库中,我需要向用户发送电子邮件。到目前为止,有13个 jar 头电子邮件。
每封电子邮件都有自己的模板(我使用的是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...
}
另一种方法是使用接口(interface)
IEmailQuery
void ExecuteQuery()
但是,如果使用接口(interface),则仍然需要实例化Query类。它不保存任何代码,也不会使代码更易于维护。
通过反射,我可以执行某种操作,例如使用模式命名所有电子邮件查询:
SecurityTraining的电子邮件模板 key 的查询名称为SecurityTrainingEmailQuery,我可以使用反射来实例化并调用ExecuteQuery方法。
如果不使用反射,是否没有更干净的接线方式?
最佳答案
实际上,这对我来说似乎不太臭。如果您不喜欢该转换语句,则可以使用IEmailQuery-Path并将其连接成Dictionary<string,IEmailQuery>
。
这可能节省了一些代码行,因为您可以这样访问它:
QueryDictionary["MyKey"].ExecuteQuery();
干杯,
奥立佛
关于c# - 接口(interface)或switch语句,找到正确的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8590849/