2016-08-14 7 views
0

ジェネリックTが必要なすべての仕様を満たしていることを確認するクラスを作成しました。それらを集めてブール値を返すのに助けが必要です。ここで C#仕様パターンアグレゲートチェッカー

がベースからinhereits基本仕様クラス

/// <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; 
    } 
} 

そしてTでチェックする必要がバリデータクラスのすべてのcpecificationsを満たしています

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); 

何か助けてください!ありがとう!

答えて

2

たぶん私は何かを逃したが、あなたが単にここでLINQのAllを使用することができそうです:

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