添加多个元素的流畅界面问题

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();