2010-07-22 76 views
1

我正在研究用于合并任意标记和文本以生成电子邮件的组件。我将使用nvelocity的合并过程,所以我定义如下界面:TemplatingEngine设计问题

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拉出值?如果是这样,还有其他设计思路?

谢谢!

回答

0

我们我的真正的问题,你觉得我的 邮件器类是做的比他应该因为他是 从XML拉出值 更多? 如果有,还有其他设计思路?

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

我认为你可能违反SRP的地方是在那里做Engine.Merge调用,这看起来应该在函数的外部完成,并且字符串结果通过而不是名称和字典。 (我也改变了MailMessageBuilder,使参数名称不完全匹配私有成员名称,这迫使你使用“this”,但这是一个小问题。)

+0

不错的建议,我将IMailMessageBuilder接口改为包含一个通用的arg以便有多种类型(xml,数据表等)。 谢谢! – Marco 2010-07-22 15:54:25