我正在尝试将规范模式应用于我的验证逻辑。但是我在异步验证方面遇到了一些问题。
假设我有一个AddRequest
需要验证的实体(具有 2 个字符串属性 FileName 和 Content)。
我需要创建 3 个验证器:
验证 FileName 是否不包含无效字符
验证内容是否正确
异步验证数据库中是否存在具有 FileName 的文件。在这种情况下,我应该有类似的东西
Task<bool> IsSatisfiedByAsync
但是我怎样才能同时实现IsSatisfiedBy
andIsSatisfiedByAsync
呢?我应该创建 2 个类似的接口ISpecification
,IAsyncSpecification
还是可以合二为一?
我的版本ISpecification
(我只需要 And)
public interface ISpecification
{
bool IsSatisfiedBy(object candidate);
ISpecification And(ISpecification other);
}
和规格
public class AndSpecification : CompositeSpecification
{
private ISpecification leftCondition;
private ISpecification rightCondition;
public AndSpecification(ISpecification left, ISpecification right)
{
leftCondition = left;
rightCondition = right;
}
public override bool IsSatisfiedBy(object o)
{
return leftCondition.IsSatisfiedBy(o) && rightCondition.IsSatisfiedBy(o);
}
}
要验证文件是否存在,我应该使用:
await _fileStorage.FileExistsAsync(addRequest.FileName);
IsSatisfiedBy
如果我真的需要异步执行该检查,我该如何编写?
例如这里我的 FileName 验证器 (1)
public class FileNameSpecification : CompositeSpecification
{
private static readonly char[] _invalidEndingCharacters = { '.', '/' };
public override bool IsSatisfiedBy(object o)
{
var request = (AddRequest)o;
if (string.IsNullOrEmpty(request.FileName))
{
return false;
}
if (request.FileName.Length > 1024)
{
return false;
}
if (request.FileName.Contains('\\') || _invalidEndingCharacters.Contains(request.FileName.Last()))
{
return false;
}
return true
}
}
我需要创建 FileExistsSpecification 并使用如下:
var validations = new FileNameSpecification().And(new FileExistsSpecification());
if(validations.IsSatisfiedBy(addRequest))
{ ... }
FileExistsSpecification
但是如果我需要异步,我该如何创建?