Reduce Revision check calls via interface
This commit is contained in:
parent
e854d3aa9a
commit
a49ba744aa
|
|
@ -26,34 +26,39 @@ namespace Microsoft.AspNetCore.Http.Features
|
||||||
public TFeature Fetch<TFeature, TState>(
|
public TFeature Fetch<TFeature, TState>(
|
||||||
ref TFeature cached,
|
ref TFeature cached,
|
||||||
TState state,
|
TState state,
|
||||||
Func<TState, TFeature> factory)
|
Func<TState, TFeature> factory) where TFeature : class
|
||||||
{
|
{
|
||||||
var cleared = false;
|
var revision = Collection.Revision;
|
||||||
if (Revision != Collection.Revision)
|
if (Revision == revision)
|
||||||
{
|
{
|
||||||
cleared = true;
|
// collection unchanged, use cached
|
||||||
Cache = default(TCache);
|
return cached ?? UpdateCached(ref cached, state, factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
// collection changed, clear cache
|
||||||
|
Cache = default(TCache);
|
||||||
|
// empty cache is current revision
|
||||||
|
Revision = revision;
|
||||||
|
|
||||||
|
return UpdateCached(ref cached, state, factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TFeature UpdateCached<TFeature, TState>(ref TFeature cached, TState state, Func<TState, TFeature> factory) where TFeature : class
|
||||||
|
{
|
||||||
|
cached = Collection.Get<TFeature>();
|
||||||
|
if (cached == null)
|
||||||
|
{
|
||||||
|
// create if item not in collection
|
||||||
|
cached = factory(state);
|
||||||
|
Collection.Set(cached);
|
||||||
|
// Revision changed by .Set, update revision
|
||||||
Revision = Collection.Revision;
|
Revision = Collection.Revision;
|
||||||
}
|
}
|
||||||
|
|
||||||
var feature = cached;
|
return cached;
|
||||||
if (feature == null || cleared)
|
|
||||||
{
|
|
||||||
feature = Collection.Get<TFeature>();
|
|
||||||
if (feature == null)
|
|
||||||
{
|
|
||||||
feature = factory(state);
|
|
||||||
|
|
||||||
Collection.Set(feature);
|
|
||||||
|
|
||||||
Revision = Collection.Revision;
|
|
||||||
}
|
|
||||||
cached = feature;
|
|
||||||
}
|
|
||||||
return feature;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TFeature Fetch<TFeature>(ref TFeature cached, Func<IFeatureCollection, TFeature> factory) =>
|
public TFeature Fetch<TFeature>(ref TFeature cached, Func<IFeatureCollection, TFeature> factory)
|
||||||
Fetch(ref cached, Collection, factory);
|
where TFeature : class => Fetch(ref cached, Collection, factory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue