From fb0fcda84cefc79a19d8cfcb784f78abc7b61ffb Mon Sep 17 00:00:00 2001 From: Serghei Cebotari Date: Sat, 30 Dec 2023 14:43:25 +0300 Subject: [PATCH] Implement KeyedServices --- .../BypassQueryModifier.cs | 2 +- .../ProductQueryModifierFactory.cs | 4 +- .../ProductQueryModifierTests.cs | 4 +- RhSolutions.Api/Middleware/QueryModifier.cs | 12 +++-- RhSolutions.Api/Models/RhsolutionsContext.cs | 6 +-- RhSolutions.Api/Program.cs | 46 ++++++++++++++++--- .../{ElbowModifier.cs => Elbow.cs} | 2 +- 7 files changed, 57 insertions(+), 19 deletions(-) rename {RhSolutions.QueryModifiers => RhSolutions.Api.Tests}/BypassQueryModifier.cs (82%) rename {RhSolutions.QueryModifiers => RhSolutions.Api.Tests}/ProductQueryModifierFactory.cs (97%) rename RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/{ElbowModifier.cs => Elbow.cs} (91%) diff --git a/RhSolutions.QueryModifiers/BypassQueryModifier.cs b/RhSolutions.Api.Tests/BypassQueryModifier.cs similarity index 82% rename from RhSolutions.QueryModifiers/BypassQueryModifier.cs rename to RhSolutions.Api.Tests/BypassQueryModifier.cs index a8bba7e..d6c8367 100644 --- a/RhSolutions.QueryModifiers/BypassQueryModifier.cs +++ b/RhSolutions.Api.Tests/BypassQueryModifier.cs @@ -1,4 +1,4 @@ -namespace RhSolutions.QueryModifiers; +namespace RhSolutions.Api.Tests; public sealed class BypassQueryModifier : IProductQueryModifier { diff --git a/RhSolutions.QueryModifiers/ProductQueryModifierFactory.cs b/RhSolutions.Api.Tests/ProductQueryModifierFactory.cs similarity index 97% rename from RhSolutions.QueryModifiers/ProductQueryModifierFactory.cs rename to RhSolutions.Api.Tests/ProductQueryModifierFactory.cs index 12b99c8..da8ea09 100644 --- a/RhSolutions.QueryModifiers/ProductQueryModifierFactory.cs +++ b/RhSolutions.Api.Tests/ProductQueryModifierFactory.cs @@ -1,7 +1,7 @@ using RhSolutions.QueryModifiers.DrinkingWaterHeatingFittings; using RhSolutions.QueryModifiers.DrinkingWaterHeatingPipes; -namespace RhSolutions.QueryModifiers; +namespace RhSolutions.Api.Tests; public class ProductQueryModifierFactory { @@ -40,7 +40,7 @@ public class ProductQueryModifierFactory case "Муфта соединительная": return new Coupling(); case "Угольник RAUTITAN": - return new ElbowModifier(); + return new Elbow(); case "Фиксатор поворота отопление": return new BendFormerHeating(); case "Фиксатор поворота водоснабжение": diff --git a/RhSolutions.Api.Tests/ProductQueryModifierTests.cs b/RhSolutions.Api.Tests/ProductQueryModifierTests.cs index b9f0e06..16c6054 100644 --- a/RhSolutions.Api.Tests/ProductQueryModifierTests.cs +++ b/RhSolutions.Api.Tests/ProductQueryModifierTests.cs @@ -1,3 +1,5 @@ +namespace RhSolutions.Api.Tests; + public abstract class ProductQueryModifierTests { protected ProductQueryModifierFactory _factory; @@ -10,7 +12,7 @@ public abstract class ProductQueryModifierTests public void Execute(string productType, string query, string expected) { var modifier = _factory.GetModifier(productType); - Assert.True(modifier.TryQueryModify(query, out var actual)); + Assert.That(modifier.TryQueryModify(query, out var actual), Is.True); Assert.That(actual, Is.EqualTo(expected)); } } \ No newline at end of file diff --git a/RhSolutions.Api/Middleware/QueryModifier.cs b/RhSolutions.Api/Middleware/QueryModifier.cs index 8a68b79..de08a86 100644 --- a/RhSolutions.Api/Middleware/QueryModifier.cs +++ b/RhSolutions.Api/Middleware/QueryModifier.cs @@ -7,21 +7,25 @@ namespace RhSolutions.Api.Middleware; public class QueryModifier { private RequestDelegate _next; + private IServiceProvider _provider; + private IProductQueryModifier? _modifier; - public QueryModifier(RequestDelegate nextDelegate) + public QueryModifier(RequestDelegate nextDelegate, IServiceProvider provider) { _next = nextDelegate; + _provider = provider; } - public async Task Invoke(HttpContext context, IProductTypePredicter typePredicter, ProductQueryModifierFactory productQueryModifierFactory) + public async Task Invoke(HttpContext context, IProductTypePredicter typePredicter) { if (context.Request.Method == HttpMethods.Get && context.Request.Path == "/api/search") { string query = context.Request.Query["query"].ToString(); var productType = typePredicter.GetPredictedProductType(query); - var modifier = productQueryModifierFactory.GetModifier(productType!); - if (modifier.TryQueryModify(query, out var modified)) + _modifier = _provider.GetRequiredKeyedService(productType); + if (_modifier == null) return; + if (_modifier.TryQueryModify(query, out var modified)) { QueryBuilder qb = new() { diff --git a/RhSolutions.Api/Models/RhsolutionsContext.cs b/RhSolutions.Api/Models/RhsolutionsContext.cs index 9d9169f..e9df2eb 100644 --- a/RhSolutions.Api/Models/RhsolutionsContext.cs +++ b/RhSolutions.Api/Models/RhsolutionsContext.cs @@ -14,8 +14,8 @@ public class RhSolutionsContext : DbContext builder.Entity() .Property(e => e.ProductSku) .HasConversion(v => v.ToString(), v => new ProductSku(v)); - builder.Entity() - .Property(e => e.DeprecatedSkus) - .HasPostgresArrayConversion(v => v.ToString(), v => new ProductSku(v)); + // builder.Entity() + // .Property(e => e.DeprecatedSkus) + // .HasPostgresArrayConversion(v => v.ToString(), v => new ProductSku(v)); } } diff --git a/RhSolutions.Api/Program.cs b/RhSolutions.Api/Program.cs index 006e312..d66735c 100644 --- a/RhSolutions.Api/Program.cs +++ b/RhSolutions.Api/Program.cs @@ -3,14 +3,16 @@ using RhSolutions.Models; using RhSolutions.Api.Services; using RhSolutions.Api.Middleware; using RhSolutions.QueryModifiers; +using RhSolutions.QueryModifiers.DrinkingWaterHeatingFittings; +using RhSolutions.QueryModifiers.DrinkingWaterHeatingPipes; var builder = WebApplication.CreateBuilder(args); -string dbHost = builder.Configuration["DB_HOST"], - dbPort = builder.Configuration["DB_PORT"], - dbName = builder.Configuration["DB_DATABASE"], - dbUser = builder.Configuration["DB_USER"], - dbPassword = builder.Configuration["DB_PASSWORD"]; +string dbHost = builder.Configuration["DB_HOST"] ?? "localhost", + dbPort = builder.Configuration["DB_PORT"] ?? "5000", + dbName = builder.Configuration["DB_DATABASE"] ?? "rhsolutions", + dbUser = builder.Configuration["DB_USER"] ?? "chebser", + dbPassword = builder.Configuration["DB_PASSWORD"] ?? "Rehau-987"; string connectionString = builder.Configuration["ConnectionsStrings:RhSolutionsLocal"] ?? $"Host={dbHost};Port={dbPort};Database={dbName};Username={dbUser};Password={dbPassword}"; @@ -24,10 +26,40 @@ builder.Services.AddDbContext(opts => } }); builder.Services.AddScoped() - .AddScoped() - .AddSingleton(); + .AddScoped(); builder.Services.AddControllers(); +builder.Services.AddKeyedScoped("Монтажная гильза") + .AddKeyedScoped("Желоб") + .AddKeyedScoped("Тройник RAUTITAN") + .AddKeyedScoped("Тройник RAUTITAN резьбовой наружный") + .AddKeyedScoped("Тройник RAUTITAN резьбовой внутренний") + .AddKeyedScoped("Переходник на наружную резьбу") + .AddKeyedScoped("Переходник на внутреннюю резьбу") + .AddKeyedScoped("Переходник с накидной гайкой") + .AddKeyedScoped("Угольник с наружной резьбой") + .AddKeyedScoped("Угольник с внутренней резьбой") + .AddKeyedScoped("Угольник настенный наружный") + .AddKeyedScoped("Угольник настенный внутренний") + .AddKeyedScoped("Проточный настенный угольник") + .AddKeyedScoped("Угольник с накидной гайкой") + .AddKeyedScoped("Муфта соединительная") + .AddKeyedScoped("Угольник RAUTITAN") + .AddKeyedScoped("Фиксатор поворота отопление") + .AddKeyedScoped("Фиксатор поворота водоснабжение") + .AddKeyedScoped("Трубка Г-образная") + .AddKeyedScoped("Трубка Т-образная") + .AddKeyedScoped("Резьбозажимное flex") + .AddKeyedScoped("Резьбозажимное stabil") + .AddKeyedScoped("Переходник на евроконус") + .AddKeyedScoped("Резьбозажимное для трубки") + .AddKeyedScoped("Ниппель") + .AddKeyedScoped("Заглушка труб RAUTITAN") + .AddKeyedScoped("Flex") + .AddKeyedScoped("Pink") + .AddKeyedScoped("Stabil") + .AddKeyedScoped("Black"); + var app = builder.Build(); app.MapControllers(); diff --git a/RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/ElbowModifier.cs b/RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/Elbow.cs similarity index 91% rename from RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/ElbowModifier.cs rename to RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/Elbow.cs index a85b0d8..ff6a265 100644 --- a/RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/ElbowModifier.cs +++ b/RhSolutions.QueryModifiers/DrinkingWaterHeatingFittings/Elbow.cs @@ -1,6 +1,6 @@ namespace RhSolutions.QueryModifiers.DrinkingWaterHeatingFittings; -public class ElbowModifier : DrinkingWaterHeatingFitting +public class Elbow : DrinkingWaterHeatingFitting { protected override string _title { get; } = "Угольник RAUTITAN -PLATINUM";