这个问题可能已经发布过,但是我找不到。

我一直在写这种东西已经很久了,我坐下来写一些新的东西,然后开始键入它,就像它是我自己的模式一样。最近出现了一个项目,我发现自己正在查看自己的代码,并开始考虑它看起来有多臭。

 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/

10-09 16:55