C# 规范模式聚合检查器

C# Specification pattern agregate checker

我创建了 class,打算检查 Generic T 是否满足所有要求的规范。需要帮助来聚合它们和 return 布尔值。

这是基本规格class

/// <summary>
/// Base spec
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseSpecification<T>
{
    public abstract Expression<Func<T, bool>> ToExpression();

    /// <summary>
    /// Meets
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    public bool Meets(T entity)
    {
        Func<T, bool> predicate = ToExpression().Compile();
        return predicate(entity);
    }
}

以及继承自基础的具体规范:

public class DeviceIsActiveSpecification : BaseSpecification<Device>
{
    public override Expression<Func<Device, bool>> ToExpression()
    {
        //Устройство поддерживает выполнение команд (Активное)
        return device => device.DeviceActivityType == DeviceActivityType.Active;
    }
}

并且必须检查的验证器 class 是 T 是否满足所有 cp 规范:

public class SpecificationValidator<T>
{
    /// <summary>
    /// Cpec list
    /// </summary>
    private readonly IList<BaseSpecification<T>> _specifications2Meet;

    public SpecificationValidator()
    {
        _specifications2Meet = new List<BaseSpecification<T>>();
    }

    /// <summary>
    /// Add cpec
    /// </summary>
    /// <typeparam name="TSecification"></typeparam>
    /// <returns></returns>
    public SpecificationValidator<T> Add<TSecification>() where TSecification : BaseSpecification<T>, new()
    {
        return Add(new TSecification());
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="specification"></param>
    /// <returns></returns>
    SpecificationValidator<T> Add(BaseSpecification<T> specification)
    {
        if (specification == null) throw new ArgumentNullException(nameof(specification));
        _specifications2Meet.Add(specification);
        return this;
    }

    /// <summary>
    /// Meets all
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    public bool MeetsAllSpecifications (T source)
    {
        ??? Need help here to agregate "Meets" 
    }
}

预期用途:

var validator = new SpecificationValidator<Device>()
            .Add<DeviceIsActiveSpecification>()
            .Add<CommunicationDeviceSpecification>()
            .MeetsAllSpecifications(device);

感谢任何帮助!谢谢!

也许我遗漏了什么,但看来您可以在这里简单地使用 LINQ 的 All

public bool MeetsAllSpecifications (T source)
{
    return specifications2Meet.All(spec => spec.Meets(source));
}