From 551f63b27cddab565cdcbe5057c2a7cf5ea6f59f Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Wed, 24 Jun 2020 15:23:00 +0300 Subject: [PATCH 01/18] Remove redundant check --- ProjectTemplates/ReferenceProject/Startup.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/Startup.cs b/ProjectTemplates/ReferenceProject/Startup.cs index fdfcbf6..569dc79 100644 --- a/ProjectTemplates/ReferenceProject/Startup.cs +++ b/ProjectTemplates/ReferenceProject/Startup.cs @@ -37,10 +37,7 @@ public Startup(IConfiguration configuration, IHostEnvironment env) // https://github.com/drwatson1/AspNet-Core-REST-Service/wiki#using-environment-variables-in-configuration-options var envPath = Path.Combine(env.ContentRootPath, ".env"); - if (File.Exists(envPath)) - { - DotNetEnv.Env.Load(envPath); - } + DotNetEnv.Env.Load(envPath); // See: https://github.com/drwatson1/AspNet-Core-REST-Service/wiki#content-formatting JsonConvert.DefaultSettings = () => From fdff5c8284ba2dd139fca84ce0c6f708decfe697 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Wed, 24 Jun 2020 18:33:39 +0300 Subject: [PATCH 02/18] Add Serilog.Filters.Expressions --- ProjectTemplates/ReferenceProject/ReferenceProject.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj index c154253..2d0d166 100644 --- a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj +++ b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj @@ -36,6 +36,7 @@ + From d5eccdfff166fcf2656bc0fa32e1972d2a9d8fd0 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Wed, 24 Jun 2020 18:34:15 +0300 Subject: [PATCH 03/18] Improve Serilog configuration --- .../appsettings.Development.json | 6 +----- .../ReferenceProject/appsettings.json | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/appsettings.Development.json b/ProjectTemplates/ReferenceProject/appsettings.Development.json index e996f3c..07332dd 100644 --- a/ProjectTemplates/ReferenceProject/appsettings.Development.json +++ b/ProjectTemplates/ReferenceProject/appsettings.Development.json @@ -1,11 +1,7 @@ { "Serilog": { "MinimumLevel": { - "Default": "Debug", - "Override": { - "Microsoft": "Debug", - "System": "Debug" - } + "Default": "Debug" } } } diff --git a/ProjectTemplates/ReferenceProject/appsettings.json b/ProjectTemplates/ReferenceProject/appsettings.json index 7c994e8..0ae0551 100644 --- a/ProjectTemplates/ReferenceProject/appsettings.json +++ b/ProjectTemplates/ReferenceProject/appsettings.json @@ -1,24 +1,35 @@ { "Serilog": { "MinimumLevel": { - "Default": "Warning", + "Default": "Information", "Override": { "Microsoft": "Warning", + "Microsoft.Hosting": "Information", "System": "Warning" } }, + "Filter": [], "WriteTo": [ { "Name": "File", "Args": { "path": "%AppData%/Logs/ReferenceProject.log", - "rollingInterval": "Day", - "buffered": false + "rollOnFileSizeLimit": true, + "fileSizeLimitBytes": 10485760, + "retainedFileCountLimit": 10, + "buffered": false, + "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] {Message:lj}{NewLine}{Exception}" } }, { - "Name": "Console" + "Name": "Console", + "Args": { + "outputTemplate": "[{Timestamp:HH:mm:ss}] [{Level:u3}] {Message:lj}{NewLine}{Exception}" + } } + ], + "Enrich": [ + "FromLogContext" ] }, "AllowedHosts": "*", From ceb8f1ee06b205a49d9946c4fc516aab38ba90a0 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:30:15 +0300 Subject: [PATCH 04/18] Use option pattern --- .../Configuration/ApplicationSettings.cs | 14 ++++++++++++ .../Controllers/ProductsController.cs | 13 +++++++++-- ProjectTemplates/ReferenceProject/Settings.cs | 22 ------------------- .../ReferenceProject/Settings/Products.cs | 10 +++++++++ ProjectTemplates/ReferenceProject/Startup.cs | 4 ++++ .../ReferenceProject/appsettings.json | 6 +++-- 6 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs delete mode 100644 ProjectTemplates/ReferenceProject/Settings.cs create mode 100644 ProjectTemplates/ReferenceProject/Settings/Products.cs diff --git a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs new file mode 100644 index 0000000..37c5cc2 --- /dev/null +++ b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace ReferenceProject.Configuration +{ + public static class ApplicationSettings + { + public static void AddSettings(this IServiceCollection services, IConfiguration Configuration) + { + services.AddOptions() + .Bind(Configuration.GetSection(Settings.Products.SectionName)); + } + } +} diff --git a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs index fe5d3f0..147cb3f 100644 --- a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs +++ b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using ReferenceProject.Repo; using System; using System.Collections.Generic; @@ -14,15 +15,17 @@ namespace ReferenceProject.Controllers [Produces("application/json")] public class ProductsController: ControllerBase { - Repo.IProductsRepo ProductsRepo { get; } + IProductsRepo ProductsRepo { get; } + IOptionsSnapshot Settings { get; } IMapper Mapper { get; } ILogger Logger { get; } - public ProductsController(IProductsRepo productsRepo, IMapper mapper, ILogger logger) + public ProductsController(IProductsRepo productsRepo, IOptionsSnapshot options, IMapper mapper, ILogger logger) { Logger = logger ?? throw new ArgumentNullException(nameof(logger)); Mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); ProductsRepo = productsRepo ?? throw new ArgumentNullException(nameof(productsRepo)); + Settings = options ?? throw new ArgumentNullException(nameof(options)); } /// @@ -111,5 +114,11 @@ public IActionResult ThrowAnException() { throw new Exception("Example exception"); } + + [HttpGet("Settings")] + public Settings.Products GetSettings() + { + return Settings.Value; + } } } diff --git a/ProjectTemplates/ReferenceProject/Settings.cs b/ProjectTemplates/ReferenceProject/Settings.cs deleted file mode 100644 index f762293..0000000 --- a/ProjectTemplates/ReferenceProject/Settings.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.Extensions.Configuration; -using System; - -namespace ReferenceProject -{ - /// - /// Use this class to get an access to options - /// - public static class Settings - { - public static string GetConnectionString(string name) => Environment.ExpandEnvironmentVariables(Startup.Configuration.GetConnectionString(name)); - public static string Get(string name) => Environment.ExpandEnvironmentVariables(Startup.Configuration[name]); - public static string TrimUrl(string url) => url.Trim(' ', '/'); - public static string JoinPath(this string src, string path) => $"{TrimUrl(src)}/{TrimUrl(path)}"; - - public static class Services - { - public static string CoolService { get; } = TrimUrl(Get("CoolServiceEndpoint")); // %ENDPOINT_HOST% will be substituted with the value from an environment variable - public static string AnotherService { get; } = TrimUrl(Get("AnotherServiceEndpoint")); - } - } -} diff --git a/ProjectTemplates/ReferenceProject/Settings/Products.cs b/ProjectTemplates/ReferenceProject/Settings/Products.cs new file mode 100644 index 0000000..d760534 --- /dev/null +++ b/ProjectTemplates/ReferenceProject/Settings/Products.cs @@ -0,0 +1,10 @@ +namespace ReferenceProject.Settings +{ + public class Products + { + public const string SectionName = "Products"; + + public string TempFolder { get; set; } + public string BackendServiceUrl { get; set; } + } +} diff --git a/ProjectTemplates/ReferenceProject/Startup.cs b/ProjectTemplates/ReferenceProject/Startup.cs index 569dc79..dc194a8 100644 --- a/ProjectTemplates/ReferenceProject/Startup.cs +++ b/ProjectTemplates/ReferenceProject/Startup.cs @@ -1,5 +1,6 @@ using Autofac; using Autofac.Configuration; +using Autofac.Core; using AutoMapper; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics.HealthChecks; @@ -15,6 +16,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; +using ReferenceProject.Configuration; using ReferenceProject.Filters; using ReferenceProject.Modules; using System.IO; @@ -94,6 +96,8 @@ public void ConfigureServices(IServiceCollection services) services.AddRouting(); services.AddControllers(); services.AddHealthChecks(); + + services.AddSettings(Configuration); } /// diff --git a/ProjectTemplates/ReferenceProject/appsettings.json b/ProjectTemplates/ReferenceProject/appsettings.json index 0ae0551..86c63f2 100644 --- a/ProjectTemplates/ReferenceProject/appsettings.json +++ b/ProjectTemplates/ReferenceProject/appsettings.json @@ -32,8 +32,10 @@ "FromLogContext" ] }, + "Products": { + "TempFolder": "%TEMP%", + "BackendServiceUrl": "http://%gateway%/backend" + }, "AllowedHosts": "*", - "CoolServiceEndpoint": "http://%ENDPOINT_HOST%/cool", - "AnotherServiceEndpoint": "http://%ENDPOINT_HOST%/another", "Urls": "http://localhost:5000" } From b2ef04c654bd7ca67bcebe2d78230d685962f24a Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:30:58 +0300 Subject: [PATCH 05/18] Make swagger config more obvious --- .../Configuration/{DependenciesConfig.cs => SwaggerConfig.cs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename ProjectTemplates/ReferenceProject/Configuration/{DependenciesConfig.cs => SwaggerConfig.cs} (96%) diff --git a/ProjectTemplates/ReferenceProject/Configuration/DependenciesConfig.cs b/ProjectTemplates/ReferenceProject/Configuration/SwaggerConfig.cs similarity index 96% rename from ProjectTemplates/ReferenceProject/Configuration/DependenciesConfig.cs rename to ProjectTemplates/ReferenceProject/Configuration/SwaggerConfig.cs index 24d46ec..c204999 100644 --- a/ProjectTemplates/ReferenceProject/Configuration/DependenciesConfig.cs +++ b/ProjectTemplates/ReferenceProject/Configuration/SwaggerConfig.cs @@ -7,7 +7,7 @@ namespace ReferenceProject { - public static class DependenciesConfig + public static class SwaggerConfig { /// /// Add Swagger middleware From 665e215225d8eee471514640238f768b60f5766b Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:35:32 +0300 Subject: [PATCH 06/18] Add swagger comments --- .../ReferenceProject/Controllers/ProductsController.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs index 147cb3f..87eb138 100644 --- a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs +++ b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs @@ -115,7 +115,13 @@ public IActionResult ThrowAnException() throw new Exception("Example exception"); } + /// + /// Demonstrate how to use application settings + /// + /// Application settings + /// Don't do this in production! You can unintentionally unclose sensitive information [HttpGet("Settings")] + [ProducesResponseType(StatusCodes.Status200OK)] public Settings.Products GetSettings() { return Settings.Value; From c7f4346091f4ae7b5bb7d9bc93fd62b89c1d033d Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:39:29 +0300 Subject: [PATCH 07/18] Update NuGet packages --- ProjectTemplates/ReferenceProject/ReferenceProject.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj index 2d0d166..83b786e 100644 --- a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj +++ b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj @@ -30,8 +30,8 @@ - - + + @@ -40,8 +40,8 @@ - - + + From b113343d9b5d91c6f02451034dfd988814feb885 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:41:22 +0300 Subject: [PATCH 08/18] Add Contrib.Extensions.Configuration.VariablesSubstitution --- ProjectTemplates/ReferenceProject/ReferenceProject.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj index 83b786e..a4f0706 100644 --- a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj +++ b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj @@ -33,6 +33,7 @@ + From d8e27e246ce98d89ff1ea6efbe552ec66629044f Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:43:41 +0300 Subject: [PATCH 09/18] Use environment variables substitution --- .../ReferenceProject/Configuration/ApplicationSettings.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs index 37c5cc2..bb28627 100644 --- a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs +++ b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Contrib.Extensions.Configuration; namespace ReferenceProject.Configuration { @@ -8,7 +9,8 @@ public static class ApplicationSettings public static void AddSettings(this IServiceCollection services, IConfiguration Configuration) { services.AddOptions() - .Bind(Configuration.GetSection(Settings.Products.SectionName)); + .Bind(Configuration.GetSection(Settings.Products.SectionName)) + .SubstituteVariables(); } } } From e38daba53e7b9cda3895a84bea984176eaddb567 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Sun, 28 Jun 2020 12:47:39 +0300 Subject: [PATCH 10/18] Add TODOs --- .../ReferenceProject/Controllers/ProductsController.cs | 1 + ProjectTemplates/ReferenceProject/Settings/Products.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs index 87eb138..7c50482 100644 --- a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs +++ b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs @@ -20,6 +20,7 @@ public class ProductsController: ControllerBase IMapper Mapper { get; } ILogger Logger { get; } + // TODO: Describe what does IOptionsSnapshot mean and what other options are there. public ProductsController(IProductsRepo productsRepo, IOptionsSnapshot options, IMapper mapper, ILogger logger) { Logger = logger ?? throw new ArgumentNullException(nameof(logger)); diff --git a/ProjectTemplates/ReferenceProject/Settings/Products.cs b/ProjectTemplates/ReferenceProject/Settings/Products.cs index d760534..bf46a77 100644 --- a/ProjectTemplates/ReferenceProject/Settings/Products.cs +++ b/ProjectTemplates/ReferenceProject/Settings/Products.cs @@ -1,5 +1,6 @@ namespace ReferenceProject.Settings { + // TODO: Describe Option Pattern public class Products { public const string SectionName = "Products"; From a650798e398e1be42a6655593deb822f9cb83b11 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Wed, 1 Jul 2020 16:08:55 +0300 Subject: [PATCH 11/18] Code style --- .../ReferenceProject/Configuration/ApplicationSettings.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs index bb28627..6b82d9e 100644 --- a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs +++ b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs @@ -6,10 +6,10 @@ namespace ReferenceProject.Configuration { public static class ApplicationSettings { - public static void AddSettings(this IServiceCollection services, IConfiguration Configuration) + public static void AddSettings(this IServiceCollection services, IConfiguration configuration) { services.AddOptions() - .Bind(Configuration.GetSection(Settings.Products.SectionName)) + .Bind(configuration.GetSection(Settings.Products.SectionName)) .SubstituteVariables(); } } From 0f620a6d11e50002622f300320ea3a3a7233d6c3 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 17 Jul 2020 16:50:34 +0300 Subject: [PATCH 12/18] Use AutoBind for options --- .../ReferenceProject/Configuration/ApplicationSettings.cs | 4 ++-- ProjectTemplates/ReferenceProject/ReferenceProject.csproj | 1 + ProjectTemplates/ReferenceProject/Settings/Products.cs | 2 -- ProjectTemplates/ReferenceProject/Startup.cs | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs index 6b82d9e..848b621 100644 --- a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs +++ b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs @@ -6,10 +6,10 @@ namespace ReferenceProject.Configuration { public static class ApplicationSettings { - public static void AddSettings(this IServiceCollection services, IConfiguration configuration) + public static void AddSettings(this IServiceCollection services) { services.AddOptions() - .Bind(configuration.GetSection(Settings.Products.SectionName)) + .AutoBind() .SubstituteVariables(); } } diff --git a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj index a4f0706..b41fe73 100644 --- a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj +++ b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj @@ -33,6 +33,7 @@ + diff --git a/ProjectTemplates/ReferenceProject/Settings/Products.cs b/ProjectTemplates/ReferenceProject/Settings/Products.cs index bf46a77..5ac86e7 100644 --- a/ProjectTemplates/ReferenceProject/Settings/Products.cs +++ b/ProjectTemplates/ReferenceProject/Settings/Products.cs @@ -3,8 +3,6 @@ // TODO: Describe Option Pattern public class Products { - public const string SectionName = "Products"; - public string TempFolder { get; set; } public string BackendServiceUrl { get; set; } } diff --git a/ProjectTemplates/ReferenceProject/Startup.cs b/ProjectTemplates/ReferenceProject/Startup.cs index dc194a8..ae4c9f9 100644 --- a/ProjectTemplates/ReferenceProject/Startup.cs +++ b/ProjectTemplates/ReferenceProject/Startup.cs @@ -97,7 +97,7 @@ public void ConfigureServices(IServiceCollection services) services.AddControllers(); services.AddHealthChecks(); - services.AddSettings(Configuration); + services.AddSettings(); } /// From cd7d6a9c0cdd8a46c09aad24cc62b4227e1f967a Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 14 Aug 2020 17:35:21 +0300 Subject: [PATCH 13/18] Remove unneeded comments --- .../ReferenceProject/Controllers/ProductsController.cs | 1 - ProjectTemplates/ReferenceProject/Settings/Products.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs index 7c50482..87eb138 100644 --- a/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs +++ b/ProjectTemplates/ReferenceProject/Controllers/ProductsController.cs @@ -20,7 +20,6 @@ public class ProductsController: ControllerBase IMapper Mapper { get; } ILogger Logger { get; } - // TODO: Describe what does IOptionsSnapshot mean and what other options are there. public ProductsController(IProductsRepo productsRepo, IOptionsSnapshot options, IMapper mapper, ILogger logger) { Logger = logger ?? throw new ArgumentNullException(nameof(logger)); diff --git a/ProjectTemplates/ReferenceProject/Settings/Products.cs b/ProjectTemplates/ReferenceProject/Settings/Products.cs index 5ac86e7..72b77bd 100644 --- a/ProjectTemplates/ReferenceProject/Settings/Products.cs +++ b/ProjectTemplates/ReferenceProject/Settings/Products.cs @@ -1,6 +1,5 @@ namespace ReferenceProject.Settings { - // TODO: Describe Option Pattern public class Products { public string TempFolder { get; set; } From 6ca89ab643998491ffd7d3dc785d655a93a9c8b4 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 14 Aug 2020 17:37:31 +0300 Subject: [PATCH 14/18] Remove unused usings --- .../ReferenceProject/Configuration/ApplicationSettings.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs index 848b621..0c4cfd7 100644 --- a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs +++ b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Contrib.Extensions.Configuration; namespace ReferenceProject.Configuration From 3ee045c1c7349674540c490191379225a40d6fbc Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 14 Aug 2020 17:40:35 +0300 Subject: [PATCH 15/18] Update NuGet-packages --- ProjectTemplates/ReferenceProject/ReferenceProject.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj index b41fe73..2dd4d8e 100644 --- a/ProjectTemplates/ReferenceProject/ReferenceProject.csproj +++ b/ProjectTemplates/ReferenceProject/ReferenceProject.csproj @@ -32,12 +32,12 @@ - + - + - + From 13d4ae0840780ad001b1378a5fbc540bc9fde2da Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 14 Aug 2020 18:35:40 +0300 Subject: [PATCH 16/18] Add comments --- .../ReferenceProject/Configuration/ApplicationSettings.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs index 0c4cfd7..e7f3f57 100644 --- a/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs +++ b/ProjectTemplates/ReferenceProject/Configuration/ApplicationSettings.cs @@ -7,6 +7,7 @@ public static class ApplicationSettings { public static void AddSettings(this IServiceCollection services) { + // Uses AutoBind and SubstituteVariables from https://github.com/drwatson1/configuration-extensions project services.AddOptions() .AutoBind() .SubstituteVariables(); From 578fbc34d7eed6b33437e10fefa04a1a7b7a308f Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 14 Aug 2020 18:41:58 +0300 Subject: [PATCH 17/18] Update description --- ProjectTemplates/How to create new template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectTemplates/How to create new template.md b/ProjectTemplates/How to create new template.md index 253d8da..0a0d80d 100644 --- a/ProjectTemplates/How to create new template.md +++ b/ProjectTemplates/How to create new template.md @@ -5,7 +5,7 @@ After making any changes do: 1. Select Release configuration for a solution 1. Select ReferenceProject in "Solution Explorer" and click "Project/Export Template..." menu item from the VS main menu 1. In the appeared dialog box select "Project template" option and "ReferenceProject" in the combobox below and click Next -1. Set the value `ASP.Net Core RESTful Service` as a template name and the `Project template to create production-ready RESTful service based on ASP.Net Core v2.X. It contains preconfigured DI-container, logging, CORS, some boilerplate code and other features` as a description +1. Set the value `ASP.Net Core RESTful Service` as a template name and theProject template to create production-ready RESTful service based on ASP.Net Core v3.1. It contains preconfigured DI-container, logging, CORS, some boilerplate code and other features `` as a description 1. Don't foget to replace .Net Core version in the description above to the appropriate one. 1. Clear checkbox "Automatically import the template into Visual Studio" if you don't want immediately import it and click Finish button 1. Extract all files from the created zip-archive to any folder as you want. Typically, the file can be found in `C:\Users\\Documents\Visual Studio 2019\My Exported Templates` folder From b5b8f47fec16fa98bce5f52aee945f1bc676cfc0 Mon Sep 17 00:00:00 2001 From: Sergey Tregub Date: Fri, 14 Aug 2020 18:46:25 +0300 Subject: [PATCH 18/18] Update template --- .../ASP.Net Core RESTful Service.zip | Bin 26846 -> 25221 bytes .../source.extension.vsixmanifest | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectTemplates/ReferenceProjectVSIX/ProjectTemplates/CSharp/.NET Core/ASP.Net Core RESTful Service.zip b/ProjectTemplates/ReferenceProjectVSIX/ProjectTemplates/CSharp/.NET Core/ASP.Net Core RESTful Service.zip index 801143e12429e2988942281a8a554cd29ec8477b..099b61f340c65ffbf13640954a972c2dda105a43 100644 GIT binary patch literal 25221 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 OYf`Y*IjjEFv;P4|8Tv5* literal 26846 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%0D*A&Vax|{Y0rk#lZPBos z7{{}FNu%^gqz0-?R(A0r+~qyB9q$%<-(hI>XZBkfG?H)G^L==wdErZ1V4I3#dMOVZ zVpOcS{CcSo>Ux#(6gFF|2hWV0S`n3}zg~1DnFeoM+3Ki|#Ja6))Y7ax1bw6QUcIkj zX5o-q*!*FRq3>aznOP&Z$LUXywb3calIO0->Kdu+wVUISdiX)UB=xGQT0noY%eQ6J z{NweUCcHC5gtKvfydw#-{#X{7O;R+>*mfk_eoM0)OCvD({#x|xh5Ihr3_y0h;&!X6 z#QOR7yzC#855Dl4)C3LGlE6`l-}R%4i;hcqxuMAt`_k zm~sMCNXp(rv^3n!;3veIeOf}>?->CXUBrB$&S6XpgqY!)V&ha#4X0dC&MfF;>H3@+kslZ z9kScT11eaZ++Y&Rf!m9`2-5aZkx#>tI=?urB05-%?MpZr7UO^hqrRcW%2_MZczrFm z0azy3zO1GHtTXiz-AoUC5#5|sZ%CrXhfB!93B#|*AFJz?S=uUc8*`PR z^nVXJUi6aR4dYYs+BqNkfu0>iu?ZVjws?aLYEhPEBk{-%sbIKvipA(7#Nrd-L?hOR zIudOpzgt&o#wR4BssOzgvy|}TVu_uDvfDe2F#m+9&Of5xehuiE4uDz z=f{jT=gzQ(4&v;GlD=Y6PZLc!VJK1=7BqPdHJ8SqS9SN%DU~?}AQNu--n9@tC^aS{ zeS35GrE10GO#&hb?mP5L_&_kqlcvsgvbyqXlm2Q6&gcN90iIUL%R}%)&*qQ~bxPVu zdT%U)I=%+G38-6@asdZjudqMPmo_suB-zwf4EV5RJaDe*S?xiO4APQ2pTMn{oUB}v zpfd}Z-C|TrGGbXi6Q;**akwQ{$ac_;bQHV@i?kB#kPTvsVqF=~*<s-~RoBKTPk0T-+NrL4@@_vL|l3>XnTsgm>i&3BFFWoshB@Ki?KgK%-iq9!UZ zbr}dyfomD_>QebI=UGrBg9GMm}k{N~Y!|?f9V!Rd^b31ozC_o(gDiBO-bl1`<#u$k zR}EzPO?zv*=t|6A7RaBb-DE{OhtAuJo$`a7LK#N z)uYS{ThG|(0H@B56KA~Ta=^qb-@K6Y!g2J_|6iGmv^k4Xb`#4*F`$AQd#w>eDP|Zp`jM#|27) zVcI$G6y(}3_-Oe29}Yc-k$uVHI8rN65tp_(GIV2yoBXuhf4OeytmPh&FqgSj#4uDF zbpIZtfiTe`fs3Ph%`Y@&BE*D5YDcMLA5;gopE)+h-0OLgcuE_%dOaB)8CJTfhk!E= z;NE~D-W4wTp&$QH;#Wde$F4%vRAo8dYJi#S37H)dElBAilKCWF2wA@iWg^ zYwl}hQIZw=_!8sBXs;pii1Sg9w^U9Gngr8v;|>Q=_;cMV`T5n?2_%oqXX>Vb*2PL` z6~F*nFz^saKSw^sUSY}--fGZC;uQ(H&}m7r*Mc88S}&%^6vC{Cv~uFc*gxJ}~D?!TtgICdakT zgF^wMS)!Jq3j^H%G+~I14JwV|n^Ia(dp-pY9*Xxq-%tPQ4(DW}OuzxP8VNA9|IY62 z0AmJ||M|XfvHDuff3mwQ3Mz4e3p^cGV_qE{-E4sL8YE#{9G(Ii{CA|ThWlWmJ%5E= zEbQ+iO)CsG6t}ZxHd9&Ytj<|mpL`K>d>J9N0yuO>j9lXGNx@iDqQ-o%x!c2tB&Krp zx;ciEbg$PftsKd4VFUv49HZVd%+(!4Fm*wC4H)Ppp`tX!4h6AQg)95dGCAi=ovq-m zlh7B{4=pne*D>vKOuxyd>nm9&@kvUQctLXrDC6#q+_+#W2r+s>okaK^a0Z%-;^|;G z+XWnPRgoYCjau~-6*OUsO9l17O|N&wOF&}TsHz2o(wkw^molN)QeZi;7}7&A6}b#O z+hq01mMXG*q!pEA^Kk~wfikvk*nH0xu0)YOn+E277Omcnrg@Isp94~3GQ&#puCTo#IDVM75}m1fm{Ad( z#guOAt&5yo!n%htDN92$40CfLAJCz(L^`)+>QctFMLf5I&78xPZiFDUgzY~j8#jm% z2&$*g0x5;9Q^TQ2@9A29Ooq){C0a|PGKsd=ehRlwEX{wh+voMxe}{ehuygFA<9Cx! zMB*>bo!x7rmtV+gNi+N-0Q}5&-JflFfIL|p2b;BuY>S5=yOWoPJI4nn*6d?5sj%y% zbljp%bu?x5*A_E65orarFLWomAlBtAS{}hF!5c4HrRzROi(z!=F=1vzt)^B0@kvb9 z2aJ6HzMrmBWfAnXztv@7n!H&iUt1;j;^;Toa3okR$Zve0qfIi70xY?^wc7qrnBAI* zX|iCiO(0GznbA^8xp&*J0DWQvHx8uz3`0j)3i0cXnj)}h9cdcYp7;qiMQ|xznfKGs zd(w`@FP1!k9M4UWW?8kzn7a^qN z&cA0dEm2PMzjGMqFu}sbV2we#_9akYRAJ7&bY91;eR_^f6uEsI%x=?$d~j;sVug;w zj%%eWbs(ePfAn`xbxA@p@e1frPQ(~B&9j&JmJq2d_Tx>m<7mbutAjUZgG@ZW(MeP| zdK8@4Ir#0mJJ!;nE|Z7KXNlI1m@Y{b=A7(gl>4osg>C;49Zb4IDyn!zqj7*iIO7z4 zu&~lqfWKqQ_kP>x)8Kp^>11z4%dGBCjxgrhkmMe%iiYNy9yh~kt+u@v$FH0W$5({( zJC$3%V2w}7G@1gJZuw!_1LBZ!^`?)q^hc7*--MTn8!a!(FEV}=6PhQ^(T;6bx4%>M zyFG(0y;)vmIv@2LO0c_C|71YCs3e$Xe|mvzY!@wGEvC1$Mrh~k;B4NKe4}N&_;UFA zFUANo8Vhd%_I}_iKtND|jA3B#=h3wkkT@7DP3$l9U^USs&~qqA{G8OZK`RAqBNwe2 z2@P9ORi*+28w(1ks3L?hFu;bBsW2K#=L@w({TIRcxFA3w!7XnJ&=t8!X~@<2h_j6Q z;str&slp67P$my=Ue6~xIPW$yv$Hqk-pE0S1wjS?6~s@t;A*svQKUW(hFhIG-^OW_WJ` z?o7YG$`B5)=3t?HJ$J-8NTvUJX?}WCpxwi;F~XJTv(cMSM>gr;vb%Ld-HL`Jw}q*j zTFNc6K(d!p2tLM7f!91F^f_T?*E(O|@{GX47l5C6j^Z%bxKFs?E5F<@uaxN?XWEnN zQKJI7z2MiupvVr+(+xU{9%S}XwfnX;Cwh=34b36n@HT-qj$e|yq1b5@Q@h#kmKfSvu9`0S@&U%O{yFCjO60YID zGskdf$*Zo1U%RZ-6jUZxsH)rD9!ky)XGKIr(EJ>8Q;84LQjeq+$8-!Id|;olrm9Ao ztr#ByGwQ#aKg!pI2lri+Khs&1`2>?lp9D{~K4z)}Z℘0$_OW1#QhsDyYYj^)doE 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 JmQmRs{U0_Ug9QKp diff --git a/ProjectTemplates/ReferenceProjectVSIX/source.extension.vsixmanifest b/ProjectTemplates/ReferenceProjectVSIX/source.extension.vsixmanifest index f40a497..3e55405 100644 --- a/ProjectTemplates/ReferenceProjectVSIX/source.extension.vsixmanifest +++ b/ProjectTemplates/ReferenceProjectVSIX/source.extension.vsixmanifest @@ -1,7 +1,7 @@ - + ASP.Net Core 3.1 RESTful Service Template Project template to create production-ready RESTful service based on ASP.Net Core 3.1. It contains preconfigured DI-container, logging, CORS, some boilerplate code and other features https://github.com/drwatson1/AspNet-Core-REST-Service