diff --git a/src/SwaggerProvider.DesignTime/Caching.fs b/src/SwaggerProvider.DesignTime/Caching.fs index 64473640..8f4ee42a 100644 --- a/src/SwaggerProvider.DesignTime/Caching.fs +++ b/src/SwaggerProvider.DesignTime/Caching.fs @@ -74,6 +74,7 @@ type ICache<'TKey, 'TValue> = abstract Set : key:'TKey * value:'TValue -> unit abstract TryRetrieve : key:'TKey * ?extendCacheExpiration:bool -> 'TValue option abstract Remove : key:'TKey -> unit + abstract GetOrAdd : key:'TKey * valueFactory:(unit -> 'TValue) -> 'TValue /// Creates a cache that uses in-memory collection let createInMemoryCache (expiration:TimeSpan) = @@ -106,4 +107,8 @@ let createInMemoryCache (expiration:TimeSpan) = match dict.TryRemove(key) with | true, _ -> log (sprintf "Explicitly removed from cache: %O" key) | _ -> () - } \ No newline at end of file + member __.GetOrAdd(key, valueFactory) = + let res, _ = dict.GetOrAdd(key, fun k -> valueFactory(), DateTime.UtcNow) + invalidationFunction key |> Async.Start + res + } diff --git a/src/SwaggerProvider.DesignTime/Provider.OpenApiClient.fs b/src/SwaggerProvider.DesignTime/Provider.OpenApiClient.fs index 3fdb1fa2..9a23c179 100644 --- a/src/SwaggerProvider.DesignTime/Provider.OpenApiClient.fs +++ b/src/SwaggerProvider.DesignTime/Provider.OpenApiClient.fs @@ -52,9 +52,7 @@ type public OpenApiClientTypeProvider(cfg : TypeProviderConfig) as this = |> sprintf "%A" - match Cache.providedTypes.TryRetrieve(cacheKey) with - | Some(ty) -> ty - | None -> + let addCache() = let schemaData = match schemaPathRaw.StartsWith("http", true, null) with | true -> @@ -88,8 +86,8 @@ type public OpenApiClientTypeProvider(cfg : TypeProviderConfig) as this = ty.AddMembers tys tempAsm.AddTypes [ty] - Cache.providedTypes.Set(cacheKey, ty) ty + Cache.providedTypes.GetOrAdd(cacheKey, addCache) ) t do diff --git a/src/SwaggerProvider.DesignTime/Provider.SwaggerClient.fs b/src/SwaggerProvider.DesignTime/Provider.SwaggerClient.fs index 7fb71b79..6b9d59a5 100644 --- a/src/SwaggerProvider.DesignTime/Provider.SwaggerClient.fs +++ b/src/SwaggerProvider.DesignTime/Provider.SwaggerClient.fs @@ -67,9 +67,7 @@ type public SwaggerTypeProvider(cfg : TypeProviderConfig) as this = (schemaPathRaw, headersStr, ignoreOperationId, ignoreControllerPrefix, preferNullable, preferAsync) |> sprintf "%A" - match Cache.providedTypes.TryRetrieve(cacheKey) with - | Some(ty) -> ty - | None -> + let addCache() = let schemaData = match schemaPathRaw.StartsWith("http", true, null) with | true -> @@ -106,8 +104,8 @@ type public SwaggerTypeProvider(cfg : TypeProviderConfig) as this = ty.AddMembers tys tempAsm.AddTypes [ty] - Cache.providedTypes.Set(cacheKey, ty) ty + Cache.providedTypes.GetOrAdd(cacheKey, addCache) ) t do