Вопрос дизайна TemplatingEngine - PullRequest
1 голос
/ 22 июля 2010

Я работаю над компонентом для объединения произвольных токенов с текстом для создания электронных писем. Я собираюсь использовать 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 голосов
/ 22 июля 2010

Теперь, на мой настоящий вопрос, как вы думаете, мой класс построителя почтовых сообщений делает больше, чем должен, так как он извлекает значения из xml?Если да, то какие-нибудь другие идеи дизайна?

Я думаю, хорошо, что он извлекает значения из XML и помещает их в класс MailMessage, поскольку единственный способ абстрагироваться - это извлечь значения вчто-то еще, что вы затем сопоставили с MailMessage.Другими словами, эта часть делает только одну вещь, отображая XML в вашем MailMessage.

Я думаю, что вы, возможно, нарушаете SRP, - это вызов внутри Engine.Merge, который выглядит так, как будто это должно быть выполнено извне функции, и вместо имени и словаря передается строковый результат.,(Я бы также изменил этот MailMessageBuilder, чтобы имя параметра не совпадало с именем частного члена, что заставляет вас использовать «this», но это второстепенный момент.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...