Skip to content

Commit 6a5fbf6

Browse files
authored
Re-add inheritance in the builders. (#457)
* Add inheritance in the builders. * Cleanup. * Clean some Select usages.
1 parent 885782d commit 6a5fbf6

File tree

18 files changed

+148
-185
lines changed

18 files changed

+148
-185
lines changed

samples/Ardalis.Sample.App2/Program.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,20 +103,23 @@ public class CustomerByIdProjectionSpec : Specification<Customer, CustomerDto>
103103
{
104104
public CustomerByIdProjectionSpec(int id)
105105
{
106-
Query.Where(x => x.Id == id);
107-
Query.Select(x => new CustomerDto(x.Id, x.Name, x.Age,
108-
x.Addresses
109-
.Select(a => new AddressDto(a.Id, a.Street, a.CustomerId))
110-
.ToList()));
106+
Query
107+
.Where(x => x.Id == id)
108+
.Select(x => new CustomerDto(
109+
x.Id,
110+
x.Name,
111+
x.Age,
112+
x.Addresses.Select(a => new AddressDto(a.Id, a.Street, a.CustomerId)).ToList()));
111113
}
112114
}
113115

114116
public class CustomerNameSpec : Specification<Customer, string>
115117
{
116118
public CustomerNameSpec(int id)
117119
{
118-
Query.Where(x => x.Id == id);
119-
Query.Select(x => x.Name);
120+
Query
121+
.Where(x => x.Id == id)
122+
.Select(x => x.Name);
120123
}
121124
}
122125

src/Ardalis.Specification/Builders/Builder_Cache.cs

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ public static ICacheSpecificationBuilder<T, TResult> EnableCache<T, TResult>(
1616
this ISpecificationBuilder<T, TResult> builder,
1717
string specificationName,
1818
params object[] args) where T : class
19-
=> EnableCache(builder, specificationName, true, args);
19+
{
20+
EnableCache((ISpecificationBuilder<T>)builder, specificationName, true, args);
21+
return (SpecificationBuilder<T, TResult>)builder;
22+
}
2023

2124
/// <summary>
2225
/// Set's the cache key for the specification.
@@ -35,17 +38,7 @@ public static ICacheSpecificationBuilder<T, TResult> EnableCache<T, TResult>(
3538
bool condition,
3639
params object[] args) where T : class
3740
{
38-
if (condition)
39-
{
40-
if (string.IsNullOrEmpty(specificationName))
41-
{
42-
throw new ArgumentException($"Required input {specificationName} was null or empty.", specificationName);
43-
}
44-
45-
builder.Specification.CacheKey = $"{specificationName}-{string.Join("-", args)}";
46-
}
47-
48-
Specification<T, TResult>.IsChainDiscarded = !condition;
41+
EnableCache((ISpecificationBuilder<T>)builder, specificationName, condition, args);
4942
return (SpecificationBuilder<T, TResult>)builder;
5043
}
5144

@@ -106,7 +99,10 @@ public static ICacheSpecificationBuilder<T> EnableCache<T>(
10699
public static ICacheSpecificationBuilder<T, TResult> WithCacheKey<T, TResult>(
107100
this ISpecificationBuilder<T, TResult> builder,
108101
string cacheKey) where T : class
109-
=> WithCacheKey(builder, cacheKey, true);
102+
{
103+
WithCacheKey((ISpecificationBuilder<T>)builder, cacheKey, true);
104+
return (SpecificationBuilder<T, TResult>)builder;
105+
}
110106

111107
/// <summary>
112108
/// Sets the cache key for the specification.
@@ -123,12 +119,7 @@ public static ICacheSpecificationBuilder<T, TResult> WithCacheKey<T, TResult>(
123119
string cacheKey,
124120
bool condition) where T : class
125121
{
126-
if (condition)
127-
{
128-
builder.Specification.CacheKey = cacheKey;
129-
}
130-
131-
Specification<T, TResult>.IsChainDiscarded = !condition;
122+
WithCacheKey((ISpecificationBuilder<T>)builder, cacheKey, condition);
132123
return (SpecificationBuilder<T, TResult>)builder;
133124
}
134125

src/Ardalis.Specification/Builders/Builder_Flags.cs

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ public static partial class SpecificationBuilderExtensions
1111
/// <returns>The updated specification builder.</returns>
1212
public static ISpecificationBuilder<T, TResult> IgnoreQueryFilters<T, TResult>(
1313
this ISpecificationBuilder<T, TResult> builder) where T : class
14-
=> IgnoreQueryFilters(builder, true);
14+
{
15+
IgnoreQueryFilters((ISpecificationBuilder<T>)builder, true);
16+
return builder;
17+
}
1518

1619
/// <summary>
1720
/// Configures the specification to ignore query filters if the condition is true.
@@ -25,11 +28,7 @@ public static ISpecificationBuilder<T, TResult> IgnoreQueryFilters<T, TResult>(
2528
this ISpecificationBuilder<T, TResult> builder,
2629
bool condition) where T : class
2730
{
28-
if (condition)
29-
{
30-
builder.Specification.IgnoreQueryFilters = true;
31-
}
32-
31+
IgnoreQueryFilters((ISpecificationBuilder<T>)builder, condition);
3332
return builder;
3433
}
3534

@@ -71,7 +70,10 @@ public static ISpecificationBuilder<T> IgnoreQueryFilters<T>(
7170
/// <returns>The updated specification builder.</returns>
7271
public static ISpecificationBuilder<T, TResult> IgnoreAutoIncludes<T, TResult>(
7372
this ISpecificationBuilder<T, TResult> builder) where T : class
74-
=> IgnoreAutoIncludes(builder, true);
73+
{
74+
IgnoreAutoIncludes((ISpecificationBuilder<T>)builder, true);
75+
return builder;
76+
}
7577

7678
/// <summary>
7779
/// Configures the specification to ignore auto includes if the condition is true.
@@ -85,11 +87,7 @@ public static ISpecificationBuilder<T, TResult> IgnoreAutoIncludes<T, TResult>(
8587
this ISpecificationBuilder<T, TResult> builder,
8688
bool condition) where T : class
8789
{
88-
if (condition)
89-
{
90-
builder.Specification.IgnoreAutoIncludes = true;
91-
}
92-
90+
IgnoreAutoIncludes((ISpecificationBuilder<T>)builder, condition);
9391
return builder;
9492
}
9593

@@ -131,7 +129,10 @@ public static ISpecificationBuilder<T> IgnoreAutoIncludes<T>(
131129
/// <returns>The updated specification builder.</returns>
132130
public static ISpecificationBuilder<T, TResult> AsSplitQuery<T, TResult>(
133131
this ISpecificationBuilder<T, TResult> builder) where T : class
134-
=> AsSplitQuery(builder, true);
132+
{
133+
AsSplitQuery((ISpecificationBuilder<T>)builder, true);
134+
return builder;
135+
}
135136

136137
/// <summary>
137138
/// Configures the specification to use split queries if the condition is true.
@@ -145,11 +146,7 @@ public static ISpecificationBuilder<T, TResult> AsSplitQuery<T, TResult>(
145146
this ISpecificationBuilder<T, TResult> builder,
146147
bool condition) where T : class
147148
{
148-
if (condition)
149-
{
150-
builder.Specification.AsSplitQuery = true;
151-
}
152-
149+
AsSplitQuery((ISpecificationBuilder<T>)builder, condition);
153150
return builder;
154151
}
155152

@@ -192,7 +189,10 @@ public static ISpecificationBuilder<T> AsSplitQuery<T>(
192189
/// <returns>The updated specification builder.</returns>
193190
public static ISpecificationBuilder<T, TResult> AsNoTracking<T, TResult>(
194191
this ISpecificationBuilder<T, TResult> builder) where T : class
195-
=> AsNoTracking(builder, true);
192+
{
193+
AsNoTracking((ISpecificationBuilder<T>)builder, true);
194+
return builder;
195+
}
196196

197197
/// <summary>
198198
/// Configures the specification to apply NoTracking behavior if the condition is true.
@@ -207,13 +207,7 @@ public static ISpecificationBuilder<T, TResult> AsNoTracking<T, TResult>(
207207
this ISpecificationBuilder<T, TResult> builder,
208208
bool condition) where T : class
209209
{
210-
if (condition)
211-
{
212-
builder.Specification.AsTracking = false;
213-
builder.Specification.AsNoTrackingWithIdentityResolution = false;
214-
builder.Specification.AsNoTracking = true;
215-
}
216-
210+
AsNoTracking((ISpecificationBuilder<T>)builder, condition);
217211
return builder;
218212
}
219213

@@ -260,7 +254,10 @@ public static ISpecificationBuilder<T> AsNoTracking<T>(
260254
/// <returns>The updated specification builder.</returns>
261255
public static ISpecificationBuilder<T, TResult> AsNoTrackingWithIdentityResolution<T, TResult>(
262256
this ISpecificationBuilder<T, TResult> builder) where T : class
263-
=> AsNoTrackingWithIdentityResolution(builder, true);
257+
{
258+
AsNoTrackingWithIdentityResolution((ISpecificationBuilder<T>)builder, true);
259+
return builder;
260+
}
264261

265262
/// <summary>
266263
/// Configures the specification to apply AsNoTrackingWithIdentityResolution behavior if the condition is true.
@@ -275,13 +272,7 @@ public static ISpecificationBuilder<T, TResult> AsNoTrackingWithIdentityResoluti
275272
this ISpecificationBuilder<T, TResult> builder,
276273
bool condition) where T : class
277274
{
278-
if (condition)
279-
{
280-
builder.Specification.AsTracking = false;
281-
builder.Specification.AsNoTracking = false;
282-
builder.Specification.AsNoTrackingWithIdentityResolution = true;
283-
}
284-
275+
AsNoTrackingWithIdentityResolution((ISpecificationBuilder<T>)builder, condition);
285276
return builder;
286277
}
287278

@@ -328,7 +319,10 @@ public static ISpecificationBuilder<T> AsNoTrackingWithIdentityResolution<T>(
328319
/// <returns>The updated specification builder.</returns>
329320
public static ISpecificationBuilder<T, TResult> AsTracking<T, TResult>(
330321
this ISpecificationBuilder<T, TResult> builder) where T : class
331-
=> AsTracking(builder, true);
322+
{
323+
AsTracking((ISpecificationBuilder<T>)builder, true);
324+
return builder;
325+
}
332326

333327
/// <summary>
334328
/// Configures the specification to apply AsTracking behavior if the condition is true.
@@ -343,13 +337,7 @@ public static ISpecificationBuilder<T, TResult> AsTracking<T, TResult>(
343337
this ISpecificationBuilder<T, TResult> builder,
344338
bool condition) where T : class
345339
{
346-
if (condition)
347-
{
348-
builder.Specification.AsNoTracking = false;
349-
builder.Specification.AsNoTrackingWithIdentityResolution = false;
350-
builder.Specification.AsTracking = true;
351-
}
352-
340+
AsTracking((ISpecificationBuilder<T>)builder, condition);
353341
return builder;
354342
}
355343

src/Ardalis.Specification/Builders/Builder_Include.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public static IIncludableSpecificationBuilder<T, TResult, TProperty> Include<T,
105105
builder.Specification.Add(expr);
106106
}
107107

108-
Specification<T, TResult>.IsChainDiscarded = !condition;
108+
Specification<T>.IsChainDiscarded = !condition;
109109
var includeBuilder = new IncludableSpecificationBuilder<T, TResult, TProperty>(builder.Specification);
110110
return includeBuilder;
111111
}
@@ -181,14 +181,14 @@ public static IIncludableSpecificationBuilder<TEntity, TResult, TProperty> ThenI
181181
bool condition)
182182
where TEntity : class
183183
{
184-
if (condition && !Specification<TEntity, TResult>.IsChainDiscarded)
184+
if (condition && !Specification<TEntity>.IsChainDiscarded)
185185
{
186186
var expr = new IncludeExpressionInfo(navigationSelector, IncludeTypeEnum.ThenInclude);
187187
builder.Specification.Add(expr);
188188
}
189189
else
190190
{
191-
Specification<TEntity, TResult>.IsChainDiscarded = true;
191+
Specification<TEntity>.IsChainDiscarded = true;
192192
}
193193

194194
var includeBuilder = new IncludableSpecificationBuilder<TEntity, TResult, TProperty>(builder.Specification);
@@ -273,14 +273,14 @@ public static IIncludableSpecificationBuilder<TEntity, TResult, TProperty> ThenI
273273
bool condition)
274274
where TEntity : class
275275
{
276-
if (condition && !Specification<TEntity, TResult>.IsChainDiscarded)
276+
if (condition && !Specification<TEntity>.IsChainDiscarded)
277277
{
278278
var expr = new IncludeExpressionInfo(navigationSelector, IncludeTypeEnum.ThenInclude);
279279
builder.Specification.Add(expr);
280280
}
281281
else
282282
{
283-
Specification<TEntity, TResult>.IsChainDiscarded = true;
283+
Specification<TEntity>.IsChainDiscarded = true;
284284
}
285285

286286
var includeBuilder = new IncludableSpecificationBuilder<TEntity, TResult, TProperty>(builder.Specification);

0 commit comments

Comments
 (0)