我正在开发 Fluent Builder,并遇到需要在不中断链接的情况下合并异步方法的需求。我该如何解决这个问题?
一个虚构的例子来说明问题
public class EmailBuilder
{
private readonly Email email;
public EmailBuilder From(string from)
{
email.From = from;
return this;
}
public async Task<EmailBuilder> To(string to)
{
if(await VerifyAsync(to))
{
email.To = to;
}
return this;
}
public EmailBuilder Body(string body)
{
email.Body = body;
return this;
}
}
调用看起来像这样:
ms.SendEmail(email => email
.From("[email protected]")
.To("[email protected]")
.Body("Hello, how are you?"));
您的“To”方法不需要成为任务,因为无论如何您都必须等待异步验证调用的结果。只需做类似的事情:
public class EmailBuilder
{
private readonly Email email;
public EmailBuilder From(string from)
{
email.From = from;
return this;
}
public EmailBuilder To(string to)
{
if(VerifyAsync(to).Wait())
{
email.To = to;
}
return this;
}
public EmailBuilder Body(string body)
{
email.Body = body;
return this;
}
}
我还要补充一点,我同意上面关于分离关注点的评论。即使添加一个单独的验证任务成员以独立于流畅的构建链进行调用也会是一个更好的方法,因为您可能希望指出问题而不是默默地失败。事实上,在我上面的编辑中,我建议如果验证调用失败则抛出错误。