From a49ba744aa1a02d4e4987cecdbade7c12f8f7e9b Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 3 May 2016 15:35:03 +0100 Subject: [PATCH] Reduce Revision check calls via interface --- .../FeatureReferences.cs | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs index a713141448..adc10b3add 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs @@ -26,34 +26,39 @@ namespace Microsoft.AspNetCore.Http.Features public TFeature Fetch( ref TFeature cached, TState state, - Func factory) + Func factory) where TFeature : class { - var cleared = false; - if (Revision != Collection.Revision) + var revision = Collection.Revision; + if (Revision == revision) { - cleared = true; - Cache = default(TCache); + // collection unchanged, use cached + 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(ref TFeature cached, TState state, Func factory) where TFeature : class + { + cached = Collection.Get(); + if (cached == null) + { + // create if item not in collection + cached = factory(state); + Collection.Set(cached); + // Revision changed by .Set, update revision Revision = Collection.Revision; } - var feature = cached; - if (feature == null || cleared) - { - feature = Collection.Get(); - if (feature == null) - { - feature = factory(state); - - Collection.Set(feature); - - Revision = Collection.Revision; - } - cached = feature; - } - return feature; + return cached; } - public TFeature Fetch(ref TFeature cached, Func factory) => - Fetch(ref cached, Collection, factory); + public TFeature Fetch(ref TFeature cached, Func factory) + where TFeature : class => Fetch(ref cached, Collection, factory); } } \ No newline at end of file