api-gateway add provider for file in memory
This commit is contained in:
		
							parent
							
								
									68f6c4988a
								
							
						
					
					
						commit
						69f0b4393d
					
				@ -11,20 +11,20 @@ namespace ApiGw_Base.Controllers
 | 
			
		||||
    public class ConfigurationController : ControllerBase
 | 
			
		||||
    {
 | 
			
		||||
        [HttpGet("mobile/marketing")]
 | 
			
		||||
        public IActionResult MobileMarketing() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Marketing);
 | 
			
		||||
        public IActionResult MobileMarketing() => ReadConfigurationFile(Channel.Mobile, ChannelType.Marketing);
 | 
			
		||||
 | 
			
		||||
        [HttpGet("mobile/shopping")]
 | 
			
		||||
        public IActionResult MobileShopping() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Shopping);
 | 
			
		||||
        public IActionResult MobileShopping() => ReadConfigurationFile(Channel.Mobile, ChannelType.Shopping);
 | 
			
		||||
 | 
			
		||||
        [HttpGet("web/marketing")]
 | 
			
		||||
        public IActionResult WebMarketing() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Marketing);
 | 
			
		||||
        public IActionResult WebMarketing() => ReadConfigurationFile(Channel.Web, ChannelType.Marketing);
 | 
			
		||||
 | 
			
		||||
        [HttpGet("web/shopping")]
 | 
			
		||||
        public IActionResult WebShopping() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Shopping);
 | 
			
		||||
        public IActionResult WebShopping() => ReadConfigurationFile(Channel.Web, ChannelType.Shopping);
 | 
			
		||||
 | 
			
		||||
        private IActionResult ReadConfigurationFile(ConfigurationType configurationType, ConfigurationBffType configurationBffType)
 | 
			
		||||
        private IActionResult ReadConfigurationFile(Channel channel, ChannelType channelType)
 | 
			
		||||
        {
 | 
			
		||||
            var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{configurationType}.Bff.{configurationBffType}.json";
 | 
			
		||||
            var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{channel}.Bff.{channelType}.json";
 | 
			
		||||
 | 
			
		||||
            using (var streamReader = new StreamReader(path, Encoding.UTF8))
 | 
			
		||||
            {
 | 
			
		||||
@ -32,7 +32,7 @@ namespace ApiGw_Base.Controllers
 | 
			
		||||
 | 
			
		||||
                if (string.IsNullOrWhiteSpace(jsonString))
 | 
			
		||||
                {
 | 
			
		||||
                    return BadRequest($"Configuration file 'configuration.{configurationType}.Bff.{configurationBffType}.json' not found");
 | 
			
		||||
                    return BadRequest($"Configuration file 'configuration.{channel}.Bff.{channelType}.json' not found");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return Ok(jsonString);
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
namespace ApiGw_Base.Enums
 | 
			
		||||
{
 | 
			
		||||
    public enum ConfigurationType
 | 
			
		||||
    public enum Channel
 | 
			
		||||
    {
 | 
			
		||||
        Web,
 | 
			
		||||
        Mobile
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
namespace ApiGw_Base.Enums
 | 
			
		||||
{
 | 
			
		||||
    public enum ConfigurationBffType
 | 
			
		||||
    public enum ChannelType
 | 
			
		||||
    {
 | 
			
		||||
        Marketing,
 | 
			
		||||
        Shopping
 | 
			
		||||
@ -11,20 +11,20 @@ namespace ApiGw_Base.Controllers
 | 
			
		||||
    public class ConfigurationController : ControllerBase
 | 
			
		||||
    {
 | 
			
		||||
        [HttpGet("mobile/marketing")]
 | 
			
		||||
        public IActionResult MobileMarketing() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Marketing);
 | 
			
		||||
        public IActionResult MobileMarketing() => ReadConfigurationFile(Channel.Mobile, ChannelType.Marketing);
 | 
			
		||||
 | 
			
		||||
        [HttpGet("mobile/shopping")]
 | 
			
		||||
        public IActionResult MobileShopping() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Shopping);
 | 
			
		||||
        public IActionResult MobileShopping() => ReadConfigurationFile(Channel.Mobile, ChannelType.Shopping);
 | 
			
		||||
 | 
			
		||||
        [HttpGet("web/marketing")]
 | 
			
		||||
        public IActionResult WebMarketing() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Marketing);
 | 
			
		||||
        public IActionResult WebMarketing() => ReadConfigurationFile(Channel.Web, ChannelType.Marketing);
 | 
			
		||||
 | 
			
		||||
        [HttpGet("web/shopping")]
 | 
			
		||||
        public IActionResult WebShopping() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Shopping);
 | 
			
		||||
        public IActionResult WebShopping() => ReadConfigurationFile(Channel.Web, ChannelType.Shopping);
 | 
			
		||||
 | 
			
		||||
        private IActionResult ReadConfigurationFile(ConfigurationType configurationType, ConfigurationBffType configurationBffType)
 | 
			
		||||
        private IActionResult ReadConfigurationFile(Channel channel, ChannelType channelType)
 | 
			
		||||
        {
 | 
			
		||||
            var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{configurationType}.Bff.{configurationBffType}.json";
 | 
			
		||||
            var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{channel}.Bff.{channelType}.json";
 | 
			
		||||
 | 
			
		||||
            using (var streamReader = new StreamReader(path, Encoding.UTF8))
 | 
			
		||||
            {
 | 
			
		||||
@ -32,7 +32,7 @@ namespace ApiGw_Base.Controllers
 | 
			
		||||
 | 
			
		||||
                if (string.IsNullOrWhiteSpace(jsonString))
 | 
			
		||||
                {
 | 
			
		||||
                    return BadRequest($"Configuration file 'configuration.{configurationType}.Bff.{configurationBffType}.json' not found");
 | 
			
		||||
                    return BadRequest($"Configuration file 'configuration.{channel}.Bff.{channelType}.json' not found");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return Ok(jsonString);
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
namespace ApiGw_Base.Enums
 | 
			
		||||
{
 | 
			
		||||
    public enum ConfigurationType
 | 
			
		||||
    public enum Channel
 | 
			
		||||
    {
 | 
			
		||||
        Web,
 | 
			
		||||
        Mobile
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
namespace ApiGw_Base.Enums
 | 
			
		||||
{
 | 
			
		||||
    public enum ConfigurationBffType
 | 
			
		||||
    public enum ChannelType
 | 
			
		||||
    {
 | 
			
		||||
        Marketing,
 | 
			
		||||
        Shopping
 | 
			
		||||
							
								
								
									
										13
									
								
								src/ApiGateways/ApiGw-Base/Models/ServiceFabricSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/ApiGateways/ApiGw-Base/Models/ServiceFabricSettings.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
namespace OcelotApiGw.Models
 | 
			
		||||
{
 | 
			
		||||
    public class ServiceFabricSettings
 | 
			
		||||
    {
 | 
			
		||||
        public string UrlMobilMarketing { get; set; }
 | 
			
		||||
 | 
			
		||||
        public string UrlMobilShopping { get; set; }
 | 
			
		||||
 | 
			
		||||
        public string UrlWebMarketing { get; set; }
 | 
			
		||||
 | 
			
		||||
        public string UrlWebShopping { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
using OcelotApiGw.Enums;
 | 
			
		||||
using System.IO;
 | 
			
		||||
 | 
			
		||||
namespace OcelotApiGw.Orchestrators
 | 
			
		||||
{
 | 
			
		||||
@ -8,11 +7,6 @@ namespace OcelotApiGw.Orchestrators
 | 
			
		||||
    {
 | 
			
		||||
        public OrchestratorType OrchestratorType => OrchestratorType.K8S;
 | 
			
		||||
 | 
			
		||||
        public IConfigurationBuilder ConfigureOrchestrator(IConfigurationBuilder builder)
 | 
			
		||||
        {
 | 
			
		||||
            builder.AddJsonFile(Path.Combine("configuration", "configuration.json"));
 | 
			
		||||
 | 
			
		||||
            return builder;
 | 
			
		||||
        }
 | 
			
		||||
        public IConfigurationBuilder ConfigureOrchestrator(IConfigurationBuilder builder) => builder;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
using OcelotApiGw.Enums;
 | 
			
		||||
using OcelotApiGw.Providers;
 | 
			
		||||
using OcelotApiGw.Services;
 | 
			
		||||
 | 
			
		||||
namespace OcelotApiGw.Orchestrators
 | 
			
		||||
@ -19,6 +20,10 @@ namespace OcelotApiGw.Orchestrators
 | 
			
		||||
        {
 | 
			
		||||
            var config = _settingService.GetConfiguration();
 | 
			
		||||
 | 
			
		||||
            var memoryFileProvider = new InMemoryFileProvider(config);
 | 
			
		||||
 | 
			
		||||
            builder.AddJsonFile(memoryFileProvider, string.Empty, false, false);
 | 
			
		||||
 | 
			
		||||
            return builder;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								src/ApiGateways/ApiGw-Base/Providers/InMemoryFile.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/ApiGateways/ApiGw-Base/Providers/InMemoryFile.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
using Microsoft.Extensions.FileProviders;
 | 
			
		||||
using System;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace OcelotApiGw.Providers
 | 
			
		||||
{
 | 
			
		||||
    public class InMemoryFile : IFileInfo
 | 
			
		||||
    {
 | 
			
		||||
        private readonly byte[] _data;
 | 
			
		||||
 | 
			
		||||
        public InMemoryFile(string data) => _data = Encoding.UTF8.GetBytes(data);
 | 
			
		||||
 | 
			
		||||
        public Stream CreateReadStream() => new MemoryStream(_data);
 | 
			
		||||
 | 
			
		||||
        public bool Exists { get; } = true;
 | 
			
		||||
 | 
			
		||||
        public long Length => _data.Length;
 | 
			
		||||
 | 
			
		||||
        public string PhysicalPath { get; } = string.Empty;
 | 
			
		||||
 | 
			
		||||
        public string Name { get; } = string.Empty;
 | 
			
		||||
 | 
			
		||||
        public DateTimeOffset LastModified { get; } = DateTimeOffset.UtcNow;
 | 
			
		||||
 | 
			
		||||
        public bool IsDirectory { get; } = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								src/ApiGateways/ApiGw-Base/Providers/InMemoryFileProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/ApiGateways/ApiGw-Base/Providers/InMemoryFileProvider.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
using Microsoft.Extensions.FileProviders;
 | 
			
		||||
using Microsoft.Extensions.Primitives;
 | 
			
		||||
 | 
			
		||||
namespace OcelotApiGw.Providers
 | 
			
		||||
{
 | 
			
		||||
    public class InMemoryFileProvider : IFileProvider
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IFileInfo _fileInfo;
 | 
			
		||||
 | 
			
		||||
        public InMemoryFileProvider(string data) => _fileInfo = new InMemoryFile(data);
 | 
			
		||||
 | 
			
		||||
        public IFileInfo GetFileInfo(string subpath) => _fileInfo;
 | 
			
		||||
 | 
			
		||||
        public IDirectoryContents GetDirectoryContents(string subpath) => null;
 | 
			
		||||
 | 
			
		||||
        public IChangeToken Watch(string filter) => NullChangeToken.Singleton;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
using Microsoft.Extensions.Options;
 | 
			
		||||
using OcelotApiGw.Models;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
@ -10,12 +11,12 @@ namespace OcelotApiGw.Services
 | 
			
		||||
    public class SettingService : ISettingService
 | 
			
		||||
    {
 | 
			
		||||
        private readonly HttpClient _httpClient;
 | 
			
		||||
        private readonly IConfiguration _configuration;
 | 
			
		||||
        private readonly ServiceFabricSettings _serviceFabricSettings;
 | 
			
		||||
 | 
			
		||||
        public SettingService(HttpClient httpClient, IConfiguration configuration)
 | 
			
		||||
        public SettingService(HttpClient httpClient, IOptions<ServiceFabricSettings> serviceFabricSettings)
 | 
			
		||||
        {
 | 
			
		||||
            _httpClient = httpClient;
 | 
			
		||||
            _configuration = configuration;
 | 
			
		||||
            _serviceFabricSettings = serviceFabricSettings.Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string GetConfiguration()
 | 
			
		||||
@ -25,20 +26,20 @@ namespace OcelotApiGw.Services
 | 
			
		||||
            var tasks = new Func<Task>[]
 | 
			
		||||
            {
 | 
			
		||||
               async () => {
 | 
			
		||||
                   var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("MobilMarketing"));
 | 
			
		||||
                   strings.Add(res);
 | 
			
		||||
                   var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlMobilMarketing);
 | 
			
		||||
                   strings.Add(configuration);
 | 
			
		||||
               },
 | 
			
		||||
               async () => {
 | 
			
		||||
                   var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("MobilShopping"));
 | 
			
		||||
                   strings.Add(res);
 | 
			
		||||
                   var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlMobilShopping);
 | 
			
		||||
                   strings.Add(configuration);
 | 
			
		||||
               },
 | 
			
		||||
               async () => {
 | 
			
		||||
                   var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("WebMarketing"));
 | 
			
		||||
                   strings.Add(res);
 | 
			
		||||
                   var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlWebMarketing);
 | 
			
		||||
                   strings.Add(configuration);
 | 
			
		||||
               },
 | 
			
		||||
               async () => {
 | 
			
		||||
                   var res = await _httpClient.GetStringAsync(_configuration.GetValue<string>("WebShopping"));
 | 
			
		||||
                   strings.Add(res);
 | 
			
		||||
                   var configuration = await _httpClient.GetStringAsync(_serviceFabricSettings.UrlWebShopping);
 | 
			
		||||
                   strings.Add(configuration);
 | 
			
		||||
               }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,11 +2,14 @@
 | 
			
		||||
using Microsoft.AspNetCore.Hosting;
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using Microsoft.Extensions.FileProviders;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.DependencyInjection;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
using OcelotApiGw.Enums;
 | 
			
		||||
using OcelotApiGw.Models;
 | 
			
		||||
using OcelotApiGw.Orchestrators;
 | 
			
		||||
using OcelotApiGw.Providers;
 | 
			
		||||
using OcelotApiGw.Services;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
 | 
			
		||||
@ -36,6 +39,7 @@ namespace OcelotApiGw
 | 
			
		||||
            })
 | 
			
		||||
            .AddTransient<IOrchestratorStrategy, Kubernetes>()
 | 
			
		||||
            .AddTransient<IOrchestratorStrategy, ServiceFabric>()
 | 
			
		||||
            .AddTransient<IFileProvider, InMemoryFileProvider>()
 | 
			
		||||
            .AddAuthentication()
 | 
			
		||||
            .AddJwtBearer(authenticationProviderKey, options =>
 | 
			
		||||
            {
 | 
			
		||||
@ -47,6 +51,7 @@ namespace OcelotApiGw
 | 
			
		||||
                };
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            services.Configure<ServiceFabricSettings>(_configuration);
 | 
			
		||||
            services.AddHttpClient<ISettingService, SettingService>();
 | 
			
		||||
 | 
			
		||||
            var orchestratorType = _configuration.GetValue<OrchestratorType>("OrchestratorType");
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user