前言
上次,我们介绍了Pitcher,可以帮我们简化卫语句:
public User(string name, int age)
{Throw.When(string.IsNullOrWhiteSpace(name), new ArgumentNullException(nameof(name)));Throw.When(age <= 0, new ArgumentOutOfRangeException(nameof(age)));//正常业务逻辑this.Name = name; this.Age = age;
}
但是,这样的代码还是不够简洁,因为我们更关注正常业务逻辑。
Ardalis.GuardClauses
今天,我们介绍另一个Nuget包Ardalis.GuardClauses
来实现卫语句。
Ardalis.GuardClauses
提供了Guard.Against
对象,基本API如下:
Guard.Against.Null 判断是否为null
Guard.Against.NullOrEmpty 判断是否为null或空
Guard.Against.NullOrWhiteSpace 判断是否为null或空或空格
Guard.Against.OutOfRange 判断是否超出范围
相对于Pitcher,它的优势在于,每个卫语句都有返回值,前面的代码可以改成这样:
public User(string name, int age)
{this.Name = Guard.Against.NullOrWhiteSpace(name, nameof(name));this.Age = Guard.Against.OutOfRange(age, nameof(age), 1, 100);
}
自定义卫语句
除此之外,对于特殊条件的卫语句,我们可以使用Guard.Against对象编写扩展方法,让语义更清晰:
namespace Ardalis.GuardClauses
{public static class UserGuard{public static int InvalidAge(this IGuardClause guardClause, int age){var validAges = new[] { 1, 3, 5 };if (!validAges.Contains(age))throw new Exception("年龄不符");return age;}}
}public User(string name, int age)
{this.Name = Guard.Against.NullOrWhiteSpace(name, nameof(name));this.Age = Guard.Against.InvalidAge(age);
}
结论
使用Ardalis.GuardClauses,可以让卫语句更简洁易读。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“