| Feature | Is supported |
|---|---|
| Null safe | |
| Validation | |
| EF Core | |
| EF 6 |
Validation result
Error
"Field '{PropertyName}' value is not valid".
Also Specification adds prefix "Field '{PropertyName}':" for each error returned from property value Specification.
Parameters
| Parameter | Description |
|---|---|
| PropertySelector | Selector passed in constructor. |
| PropertyName | Name of candidate property. |
| PropertySpecification | Specification object passed in constructor. |
Info
Verifies if Specification is satisfied by candidate property value.
Usage
var spec = Specification
.ForProperty<Customer, CreditCard>(c => c.CreditCard,
Specification.NotNull<CreditCard>());
spec.IsSatisfiedBy(
new Customer {CreditCard = new CreditCard()}); // true
spec.IsSatisfiedBy(
new Customer {CreditCard = null}); // false
// With sub property
var emailSpec = Specification
.ForProperty<Customer, string>(c => c.Caretaker.Email,
Specification.Email());
spec.IsSatisfiedBy(
new Customer
{
Caretaker = new Customer
{
Email = "john.doe@email.com"
}
}); // true
Extensions
Every built-in Specification has extension with PropertySpecification<T, TProperty>.
Specification
.ForProperty<Customer, int>(c => c.CustomerId,
Specification.GreaterThan(0));
// ... is equivalent with:
Specification.GreaterThan<Customer, int>(
c => c.CustomerId, 0);
Null support
PropertySpecification<T, TProperty> doesn't throw NullReferenceException, when candidate or his sub-property is null, but returns false.
Null as value of property works normally.
var spec = Specification
.CreditCard<Customer>(c => c.CreditCard.CardNumber);
spec.IsSatisfiedBy(new Customer {CreditCard = new CreditCard {CardNumber = null}}); // return false, because Specification result
spec.IsSatisfiedBy(new Customer {CreditCard = null}); // return false
spec.IsSatisfiedBy(null); // return false

