2016-08-14 5 views
0

Ich habe Klasse erstellt, die beabsichtigen zu überprüfen ist Generic T erfüllt alle erforderlichen Spezifikationen. Brauchen Sie Hilfe, um sie zu aggregieren und booleschen Wert zurückzugeben. HierC# Spezifikation Muster aggregate checker

ist die Basis-Spezifikation Klasse

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

und konkrete Spezifikation, die von der Basis inhereits:

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

Und der Validator-Klasse, die T zu prüfen hat, ist erfüllt alle 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" 
    } 
} 

Vorgesehene Verwendung:

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

Jede Hilfe wird geschätzt! Vielen Dank!

Antwort

2

Vielleicht habe ich etwas verpasst, aber es scheint, dass Sie einfach LINQ All hier verwenden können:

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