Reduce Revision check calls via interface

This commit is contained in:
Ben Adams 2016-05-03 15:35:03 +01:00 committed by Chris R
parent e854d3aa9a
commit a49ba744aa
1 changed files with 27 additions and 22 deletions

View File

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