public Artifact Artifact(Product product) { var cacheKey = product.ToString(); if (_resolved.TryGetValue(cacheKey, out var artifact)) { return(artifact); } switch (ArtifactBuildState) { case ArtifactBuildState.Released: ReleasedVersionResolver.TryResolve(product, this, OsMonikers.CurrentPlatform(), out artifact); break; case ArtifactBuildState.Snapshot: SnapshotApiResolver.TryResolve(product, this, OsMonikers.CurrentPlatform(), null, out artifact); break; case ArtifactBuildState.BuildCandidate: StagingVersionResolver.TryResolve(product, this, BuildHash, out artifact); break; default: throw new ArgumentOutOfRangeException(nameof(ArtifactBuildState), $"{ArtifactBuildState} not expected here"); } _resolved.TryAdd(cacheKey, artifact); return(artifact); }