我正在开发一个组件,用于将任意标记与文本合并以生成电子邮件。我将使用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中提取了值吗?如果是这样,还有其他任何设计理念吗?
谢谢!
答案 0 :(得分:0)
现在我真正的问题,你认为吗? 我的邮件消息构建器类正在做 因为他是他应该超过他应该的 从xml中提取出值? 如果是这样,还有其他任何设计理念吗?
我觉得很好,他从XML中提取值并将它们放在MailMessage类中,因为抽象的唯一方法就是将值提取到您随后映射到MailMessage的其他内容中。换句话说,该部分只做一件事,将XML映射到您的MailMessage。
我认为您可能违反SRP的地方是在那里进行Engine.Merge调用,这似乎应该在函数外部完成并传入字符串结果而不是名称和字典。 (我还会更改MailMessageBuilder以使参数名称与私有成员名称不完全匹配,这会强制您使用“this”,但这只是一个小问题。)