TemplatingEngine设计问题

时间:2010-07-22 14:53:44

标签: c# .net asp.net design-patterns

我正在开发一个组件,用于将任意标记与文本合并以生成电子邮件。我将使用nvelocity进行合并过程,因此我定义了以下接口:

public interface ITemplateEngine
{
    string Merge(string template, IDictionary<string, object> data);
}

现在,在我的场景中,实现类返回一个包含xml(主题,主体节点)的字符串。接下来,我需要一个用于返回邮件项目的中间类。这是班级。

    public class MailMessageBuilder : IMailMessageBuilder
{
    private readonly ITemplateEngine engine;

    public MailMessageBuilder(ITemplateEngine engine)
    {
        this.engine = engine;
    }

    public MailMessage Build(string name, IDictionary<string, object> tokens)
    {
        var doc = new XmlDocument();
        doc.LoadXml(engine.Merge(name, tokens));

        var msg = new MailMessage();
        var node = doc.DocumentElement.SelectSingleNode("Body");

        msg.Body = node.InnerText;
        msg.IsBodyHtml = bool.Parse(node.Attributes.GetNamedItem("isHtml").Value);
        msg.Subject = doc.DocumentElement.SelectSingleNode("Subject").InnerText;

        return msg;
    }
}

现在我真正的问题是,你认为我的邮件消息构建器类比他应该做的更多,因为他从xml中提取了值吗?如果是这样,还有其他任何设计理念吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

现在我真正的问题,你认为吗?   我的邮件消息构建器类正在做   因为他是他应该超过他应该的   从xml中提取出值?   如果是这样,还有其他任何设计理念吗?

我觉得很好,他从XML中提取值并将它们放在MailMessage类中,因为抽象的唯一方法就是将值提取到您随后映射到MailMessage的其他内容中。换句话说,该部分只做一件事,将XML映射到您的MailMessage。

我认为您可能违反SRP的地方是在那里进行Engine.Merge调用,这似乎应该在函数外部完成并传入字符串结果而不是名称和字典。 (我还会更改MailMessageBuilder以使参数名称与私有成员名称不完全匹配,这会强制您使用“this”,但这只是一个小问题。)