前言
上次,我们介绍了 Pitcher
,可以帮我们简化卫语句:
1
2
3
4
5
6
7
8
9
|
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
,它的优势在于,每个卫语句都有返回值,前面的代码可以改成这样:
1
2
3
4
5
|
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
对象编写扩展方法,让语义更清晰:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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);
}
|
相关链接
https://mp.weixin.qq.com/s?__biz=MzU3MjUzNjc1Ng==&mid=2247487086&idx=1&sn=1481610d4f71e0ef5057ddd8eed848bc&chksm=fcce2cb5cbb9a5a360e12ced864dda0b59f6208ce24434cac274db461cbcd65a7f7cbc2bdf4a&scene=178&cur_album_id=1986653731890724865#rd