From aab6478f9a3699d83c7f32b106849360e997e5f7 Mon Sep 17 00:00:00 2001 From: OlgunR Date: Mon, 20 Apr 2026 13:23:16 +0200 Subject: [PATCH] Refactor API clients to use interface-based DI Introduce interfaces for all API clients and update dependency injection to use these interfaces. Refactor services and components to depend on abstractions instead of concrete implementations, improving testability and maintainability. --- DbFirst.BlazorWebApp/Components/CatalogsGrid.razor | 2 +- DbFirst.BlazorWebApp/Components/MassDataGrid.razor | 2 +- .../Components/Pages/Dashboard.razor | 2 +- DbFirst.BlazorWebApp/Program.cs | 8 ++++---- DbFirst.BlazorWebApp/Services/BandLayoutService.cs | 2 +- DbFirst.BlazorWebApp/Services/CatalogApiClient.cs | 2 +- DbFirst.BlazorWebApp/Services/DashboardApiClient.cs | 2 +- DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs | 12 ++++++++++++ DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs | 9 +++++++++ DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs | 11 +++++++++++ DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs | 12 ++++++++++++ DbFirst.BlazorWebApp/Services/LayoutApiClient.cs | 2 +- DbFirst.BlazorWebApp/Services/MassDataApiClient.cs | 2 +- 13 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs create mode 100644 DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs create mode 100644 DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs create mode 100644 DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs diff --git a/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor b/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor index e3d5372..f2602a0 100644 --- a/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor +++ b/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor @@ -1,5 +1,5 @@ @inherits BandGridBase -@inject CatalogApiClient Api +@inject ICatalogApiClient Api @if (!string.IsNullOrWhiteSpace(errorMessage)) { diff --git a/DbFirst.BlazorWebApp/Components/MassDataGrid.razor b/DbFirst.BlazorWebApp/Components/MassDataGrid.razor index 0e93895..7fb68a1 100644 --- a/DbFirst.BlazorWebApp/Components/MassDataGrid.razor +++ b/DbFirst.BlazorWebApp/Components/MassDataGrid.razor @@ -1,5 +1,5 @@ @inherits BandGridBase -@inject MassDataApiClient Api +@inject IMassDataApiClient Api @if (!string.IsNullOrWhiteSpace(errorMessage)) { diff --git a/DbFirst.BlazorWebApp/Components/Pages/Dashboard.razor b/DbFirst.BlazorWebApp/Components/Pages/Dashboard.razor index 727b154..0284f19 100644 --- a/DbFirst.BlazorWebApp/Components/Pages/Dashboard.razor +++ b/DbFirst.BlazorWebApp/Components/Pages/Dashboard.razor @@ -3,7 +3,7 @@ @implements IAsyncDisposable @inject IOptions AppSettingsOptions @inject NavigationManager Navigation -@inject DashboardApiClient DashboardApi +@inject IDashboardApiClient DashboardApi Dashboards diff --git a/DbFirst.BlazorWebApp/Program.cs b/DbFirst.BlazorWebApp/Program.cs index 255352c..1184383 100644 --- a/DbFirst.BlazorWebApp/Program.cs +++ b/DbFirst.BlazorWebApp/Program.cs @@ -21,10 +21,10 @@ void ConfigureClient(HttpClient client) client.BaseAddress = new Uri(apiBaseUrl); } -builder.Services.AddHttpClient(ConfigureClient); -builder.Services.AddHttpClient(ConfigureClient); -builder.Services.AddHttpClient(ConfigureClient); -builder.Services.AddHttpClient(ConfigureClient); +builder.Services.AddHttpClient(ConfigureClient); +builder.Services.AddHttpClient(ConfigureClient); +builder.Services.AddHttpClient(ConfigureClient); +builder.Services.AddHttpClient(ConfigureClient); var app = builder.Build(); diff --git a/DbFirst.BlazorWebApp/Services/BandLayoutService.cs b/DbFirst.BlazorWebApp/Services/BandLayoutService.cs index 0082f80..5d0414b 100644 --- a/DbFirst.BlazorWebApp/Services/BandLayoutService.cs +++ b/DbFirst.BlazorWebApp/Services/BandLayoutService.cs @@ -5,7 +5,7 @@ using System.Text.Json; namespace DbFirst.BlazorWebApp.Services { - public class BandLayoutService(LayoutApiClient layoutApi, IJSRuntime jsRuntime) + public class BandLayoutService(ILayoutApiClient layoutApi, IJSRuntime jsRuntime) { private const string LayoutUserStorageKey = "layoutUser"; private readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); diff --git a/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs b/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs index f5a3b9d..0c97a9f 100644 --- a/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs @@ -4,7 +4,7 @@ using DbFirst.BlazorWebApp.Models; namespace DbFirst.BlazorWebApp.Services; -public class CatalogApiClient +public class CatalogApiClient : ICatalogApiClient { private readonly HttpClient _httpClient; private const string Endpoint = "api/catalogs"; diff --git a/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs b/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs index cfc0773..9ea41f8 100644 --- a/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs @@ -3,7 +3,7 @@ using DbFirst.BlazorWebApp.Models; namespace DbFirst.BlazorWebApp.Services; -public class DashboardApiClient +public class DashboardApiClient : IDashboardApiClient { private readonly HttpClient _httpClient; private const string Endpoint = "api/dashboard/dashboards"; diff --git a/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs b/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs new file mode 100644 index 0000000..c307205 --- /dev/null +++ b/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs @@ -0,0 +1,12 @@ +using DbFirst.BlazorWebApp.Models; + +namespace DbFirst.BlazorWebApp.Services; + +public interface ICatalogApiClient +{ + Task> GetAllAsync(); + Task GetByIdAsync(int id); + Task> CreateAsync(CatalogWriteDto dto); + Task> UpdateAsync(int id, CatalogWriteDto dto); + Task> DeleteAsync(int id); +} \ No newline at end of file diff --git a/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs b/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs new file mode 100644 index 0000000..fba9d7b --- /dev/null +++ b/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs @@ -0,0 +1,9 @@ +using DbFirst.BlazorWebApp.Models; + +namespace DbFirst.BlazorWebApp.Services +{ + public interface IDashboardApiClient + { + Task> GetAllAsync(); + } +} diff --git a/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs b/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs new file mode 100644 index 0000000..a39116e --- /dev/null +++ b/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs @@ -0,0 +1,11 @@ +using DbFirst.BlazorWebApp.Models; + +namespace DbFirst.BlazorWebApp.Services +{ + public interface ILayoutApiClient + { + Task GetAsync(string layoutType, string layoutKey, string userName); + Task UpsertAsync(LayoutDto dto); + Task DeleteAsync(string layoutType, string layoutKey, string userName); + } +} diff --git a/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs b/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs new file mode 100644 index 0000000..13f3e95 --- /dev/null +++ b/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs @@ -0,0 +1,12 @@ +using DbFirst.BlazorWebApp.Models; + +namespace DbFirst.BlazorWebApp.Services +{ + public interface IMassDataApiClient + { + Task GetCountAsync(); + Task> GetAllAsync(int? skip, int? take); + Task> UpsertAsync(MassDataWriteDto dto); + Task GetByCustomerNameAsync(string customerName); + } +} diff --git a/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs b/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs index 0a863e8..ca83973 100644 --- a/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs @@ -3,7 +3,7 @@ using DbFirst.BlazorWebApp.Models; namespace DbFirst.BlazorWebApp.Services; -public class LayoutApiClient +public class LayoutApiClient : ILayoutApiClient { private readonly HttpClient _httpClient; private const string Endpoint = "api/layouts"; diff --git a/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs b/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs index 4735881..1f45682 100644 --- a/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs @@ -3,7 +3,7 @@ using DbFirst.BlazorWebApp.Models; namespace DbFirst.BlazorWebApp.Services; -public class MassDataApiClient +public class MassDataApiClient : IMassDataApiClient { private readonly HttpClient _httpClient; private const string Endpoint = "api/massdata";