添加多个元素的流畅界面问题
Fluent interface issue with adding multiple elements
我有以下代码(来自mailgun_csharp):
var message = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body)
.AddToRecipient(new Recipient { Email = "a@a.com", DisplayName = "a" })
.GetMessage();
到目前为止,还不错...
现在我想添加 2 个收件人:
var message = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body)
.AddToRecipient(new Recipient { Email = "a@a.com", DisplayName = "a" })
.AddToRecipient(new Recipient { Email = "b@a.com", DisplayName = "b" })
.GetMessage();
这个也很好用...
但是如果我有一个列表并且我想将整个列表添加到 .AddRecipient,我该如何以编程方式执行此操作?
您可以使用 Aggregate
来自 System.Linq
:
var messageBuilder = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body);
var message = recipients.Aggregate(messageBuilder,
(builder, recipient) => builder.AddToRecipient(recipient),
builder => builder.GetMessage());
看起来 mailgun_csharp 库缺少将收件人列表传递给 API 的方法。 C# 允许您通过添加自己的实现作为扩展来修复此缺点:
public static class MessageBuilderExtensions {
public static IMessageBuilder AddToRecipients(
this IMessageBuilder builder
, IEnumerable<IRecipient> recipients
, JObject recipientVariables = null) {
foreach (var recipient in recipients) {
builder = builder.AddRecipient(recipient, recipientVariables);
}
return builder;
}
}
现在您可以编写以下代码:
IEnumerable<IRecipient> myListOfRecipients = ...
var message = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body)
.AddToRecipients(myListOfRecipients)
.GetMessage();
我有以下代码(来自mailgun_csharp):
var message = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body)
.AddToRecipient(new Recipient { Email = "a@a.com", DisplayName = "a" })
.GetMessage();
到目前为止,还不错...
现在我想添加 2 个收件人:
var message = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body)
.AddToRecipient(new Recipient { Email = "a@a.com", DisplayName = "a" })
.AddToRecipient(new Recipient { Email = "b@a.com", DisplayName = "b" })
.GetMessage();
这个也很好用...
但是如果我有一个列表并且我想将整个列表添加到 .AddRecipient,我该如何以编程方式执行此操作?
您可以使用 Aggregate
来自 System.Linq
:
var messageBuilder = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body);
var message = recipients.Aggregate(messageBuilder,
(builder, recipient) => builder.AddToRecipient(recipient),
builder => builder.GetMessage());
看起来 mailgun_csharp 库缺少将收件人列表传递给 API 的方法。 C# 允许您通过添加自己的实现作为扩展来修复此缺点:
public static class MessageBuilderExtensions {
public static IMessageBuilder AddToRecipients(
this IMessageBuilder builder
, IEnumerable<IRecipient> recipients
, JObject recipientVariables = null) {
foreach (var recipient in recipients) {
builder = builder.AddRecipient(recipient, recipientVariables);
}
return builder;
}
}
现在您可以编写以下代码:
IEnumerable<IRecipient> myListOfRecipients = ...
var message = new MessageBuilder()
.SetSubject(Subject)
.SetFromAddress(new Recipient { Email = From.Address, DisplayName = From.DisplayName })
.SetHtmlBody(Body)
.AddToRecipients(myListOfRecipients)
.GetMessage();