Abstraction

FluentSpecification.Abstractions is a abstraction layer for Specification design pattern. Contains also interfaces and structures for validation and Linq scenarios.

ISpecification<T>
ISpecification
IValidationSpecification<T>
ILinqSpecification<T>
ILinqSpecification
IComplexSpecification<T>

Specification

ISpecification<T> is absolutely base, for all Specifications and extensions, across all FluentSpecification packages. But there is couple of differences with known Specification design pattern - interface contains only IsSatisfiedBy method without And, Or etc. This methods are moved as extensions to the FluentSpecification.Core. Thanks that implementation of simple Specification is very easy - you need to implement only IsSatisfiedBy method.
Every Specifications also implements empty ISpecification interface - you can represent any kind of Specification regardless of the type.

Validation

For Validation scenarios, IValidationSpecification<T> is prepared. This interface inherit from ISpecification<T>.
Contains also IsSatisfiedBy method but with outer parameter - SpecificationResult. In this structure, Specification returns all data related to validation of input candidate. Content of SpecificationResult is described in next section.

Linq

Specifications, that support Linq expressions, should implement ILinqSpecification<T> interface. GetExpression method returns equivalent of IsSatisfiedBy method, as Linq expression. ILinqSpecification<T> inherit from ISpecification<T>.

All in one

IComplexSpecification<T> interface, is prepared for Specifications with support of all functionalities, described above. Every built-in Specifications implements this interface.

Negatable

INegatableSpecification<T>
ISpecification
INegatableValidationSpecification<T>
INegatableLinqSpecification<T>
GitHub