2010-07-22 5 views
1

Я работаю над компонентом для слияния произвольных токенов с текстом, чтобы генерировать электронные письма. Я собираюсь использовать NVelocity для процесса слияния, поэтому я определил следующий интерфейс:TemplatingEngine Design Question

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, чтобы имя параметра не соответствовало точно имени частного члена, что заставляет вас использовать «это», но это небольшая точка.)

+0

Хорошее предложение, я изменил интерфейс IMailMessageBuilder на включают общий аргумент, чтобы иметь несколько типов (xml, таблица данных и т. д.). спасибо! – Marco