SwaggerUiResourceProvider.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Reflection;
  4. using VCommon.IO;
  5. namespace VCommon.VSwaggerUI
  6. {
  7. public class SwaggerUiResourceProvider : ISwaggerUiResourceProvider
  8. {
  9. public static ISwaggerUiResourceProvider Version1 => Version1LazyHolder.Instance;
  10. public static ISwaggerUiResourceProvider Version2 => Version2LazyHolder.Instance;
  11. //------------------------------------------------
  12. private static readonly LazyHolder<SwaggerUiResourceProvider> Version1LazyHolder = new LazyHolder<SwaggerUiResourceProvider>(() => new SwaggerUiResourceProvider(typeof(Version1._NamespaceHolder).Namespace));
  13. private static readonly LazyHolder<SwaggerUiResourceProvider> Version2LazyHolder = new LazyHolder<SwaggerUiResourceProvider>(() => new SwaggerUiResourceProvider(typeof(Version2._NamespaceHolder).Namespace));
  14. //------------------------------------------------
  15. private readonly string _resourceNamespace;
  16. private readonly IReadOnlyDictionary<string, byte[]> _cachedBinResource;
  17. internal SwaggerUiResourceProvider(string embeddedResourceNamespace)
  18. {
  19. _resourceNamespace = embeddedResourceNamespace;
  20. var assembly = Assembly.GetExecutingAssembly();
  21. _cachedBinResource = assembly.GetManifestResourceNames()
  22. .Where(p => p.StartsWith(_resourceNamespace))
  23. .ToDictionary(p => p, p => assembly.GetManifestResourceStream(p).ReadFully());
  24. }
  25. public byte[] GetBinResource(string name)
  26. {
  27. return _cachedBinResource.TryGetValue(_resourceNamespace + "." + name, out var data)
  28. ? data
  29. : null;
  30. }
  31. public string GetIndex(string api)
  32. {
  33. var html = System.Text.Encoding.UTF8.GetString(GetBinResource("index.html"));
  34. html = html.Replace("$(API_PATH_WITHOUT_ROOT)", api);
  35. return html;
  36. }
  37. }
  38. }