🤖 Implement DI and IoC

pull/3/head
Alexis Drai 2 years ago
parent 9faa65f48d
commit 26664449fc

@ -1,5 +1,5 @@
using blazor_lab.Models; using blazor_lab.Models;
using Blazored.LocalStorage; using blazor_lab.Services;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Components.Forms;
@ -9,13 +9,10 @@ namespace blazor_lab.Pages
{ {
[Inject] [Inject]
public ILocalStorageService LocalStorageService { get; set; } public IDataService DataService { get; set; }
[Inject] [Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; } public NavigationManager NavigationManager { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
/// <summary> /// <summary>
/// The default enchant categories. /// The default enchant categories.
@ -39,43 +36,7 @@ namespace blazor_lab.Pages
private async void HandleValidSubmit() private async void HandleValidSubmit()
{ {
// Get the current data await DataService.Add(itemModel);
var currentData = await LocalStorageService.GetItemAsync<List<Item>>("data");
// Simulate the Id
itemModel.Id = currentData.Max(item => item.Id) + 1;
// Add the item to the current data
currentData.Add(new Item
{
Id = itemModel.Id,
DisplayName = itemModel.DisplayName,
Name = itemModel.Name,
RepairWith = itemModel.RepairWith,
EnchantCategories = itemModel.EnchantCategories,
MaxDurability = itemModel.MaxDurability,
StackSize = itemModel.StackSize,
CreatedDate = DateTime.Now
});
// Save the image
var imagePathInfo = new DirectoryInfo($"{WebHostEnvironment.WebRootPath}/images");
// Check if the folder "images" exist
if (!imagePathInfo.Exists)
{
imagePathInfo.Create();
}
// Determine the image name
var fileName = new FileInfo($"{imagePathInfo}/{itemModel.Name}.png");
// Write the file content
await File.WriteAllBytesAsync(fileName.FullName, itemModel.ImageContent);
// Save the data
await LocalStorageService.SetItemAsync("data", currentData);
NavigationManager.NavigateTo("list"); NavigationManager.NavigateTo("list");
} }
private async Task LoadImage(InputFileChangeEventArgs e) private async Task LoadImage(InputFileChangeEventArgs e)

@ -1,4 +1,5 @@
using blazor_lab.Models; using blazor_lab.Models;
using blazor_lab.Services;
using Blazored.LocalStorage; using Blazored.LocalStorage;
using Blazorise.DataGrid; using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
@ -12,16 +13,10 @@ namespace blazor_lab.Pages
private int totalItems; private int totalItems;
[Inject] [Inject]
public HttpClient HttpClient { get; set; } public IDataService DataService { get; set; }
[Inject] [Inject]
public ILocalStorageService LocalStorageService { get; set; } public IWebHostEnvironment WebHostEnvironment { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender) protected override async Task OnAfterRenderAsync(bool firstRender)
{ {
@ -31,15 +26,7 @@ namespace blazor_lab.Pages
return; return;
} }
var currentData = await LocalStorageService.GetItemAsync<Item[]>("data"); var currentData = await DataService.List(1, 10);
// Check if data exist in the local storage
if (currentData == null)
{
// this code add in the local storage the fake data (we load the data sync for initialize the data before load the OnReadData method)
var originalData = HttpClient.GetFromJsonAsync<Item[]>($"{NavigationManager.BaseUri}fake-data.json").Result;
await LocalStorageService.SetItemAsync("data", originalData);
}
} }
private async Task OnReadData(DataGridReadDataEventArgs<Item> e) private async Task OnReadData(DataGridReadDataEventArgs<Item> e)
@ -49,20 +36,16 @@ namespace blazor_lab.Pages
return; return;
} }
//Real API =>
//var response = await HttpClient.GetJsonAsync<Data[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
var response = (await LocalStorageService.GetItemAsync<Item[]>("data")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
if (!e.CancellationToken.IsCancellationRequested) if (!e.CancellationToken.IsCancellationRequested)
{ {
totalItems = (await LocalStorageService.GetItemAsync<List<Item>>("data")).Count; items = await DataService.List(e.Page, e.PageSize);
items = new List<Item>(response); // an actual data for the current page totalItems = await DataService.Count();
} }
} }
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
items = await HttpClient.GetFromJsonAsync<List<Item>>($"{NavigationManager.BaseUri}fake-data.json"); items = await DataService.List(1, 10);
} }
} }
} }

@ -3,6 +3,7 @@ using Blazorise;
using Blazorise.Bootstrap; using Blazorise.Bootstrap;
using Blazorise.Icons.FontAwesome; using Blazorise.Icons.FontAwesome;
using Blazored.LocalStorage; using Blazored.LocalStorage;
using blazor_lab.Services;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -20,6 +21,8 @@ builder.Services
builder.Services.AddBlazoredLocalStorage(); builder.Services.AddBlazoredLocalStorage();
builder.Services.AddScoped<IDataService, DataLocalService>();
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.

@ -0,0 +1,99 @@
using blazor_lab.Models;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
namespace blazor_lab.Services
{
public class DataLocalService : IDataService
{
private readonly HttpClient _httpClient;
private readonly ILocalStorageService _localStorageService;
private readonly NavigationManager _navigationManager;
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly string pathToFakeData;
public DataLocalService(
HttpClient httpClient,
ILocalStorageService localStorageService,
NavigationManager navigationManager,
IWebHostEnvironment webHostEnvironment
)
{
_httpClient = httpClient;
_localStorageService = localStorageService;
_navigationManager = navigationManager;
_webHostEnvironment = webHostEnvironment;
pathToFakeData = $"{_navigationManager.BaseUri}fake-data.json";
}
public async Task Add(ItemModel itemModel)
{
// Get the current data
var currentData = await _localStorageService.GetItemAsync<List<Item>>("data");
// Simulate the Id
itemModel.Id = currentData.Max(item => item.Id) + 1;
// Add the item to the current data
currentData.Add(new Item
{
Id = itemModel.Id,
DisplayName = itemModel.DisplayName,
Name = itemModel.Name,
RepairWith = itemModel.RepairWith,
EnchantCategories = itemModel.EnchantCategories,
MaxDurability = itemModel.MaxDurability,
StackSize = itemModel.StackSize,
CreatedDate = DateTime.Now
});
// Save the image
var imagePathInfo = new DirectoryInfo($"{_webHostEnvironment.WebRootPath}/images");
// Check if the folder "images" exist
if (!imagePathInfo.Exists)
{
imagePathInfo.Create();
}
// Determine the image name
var fileName = new FileInfo($"{imagePathInfo}/{itemModel.Name}.png");
// Write the file content
await File.WriteAllBytesAsync(fileName.FullName, itemModel.ImageContent);
// Save the data
await _localStorageService.SetItemAsync("data", currentData);
}
public async Task<int> Count()
{
if (await _localStorageService.GetItemAsync<Item[]>("data") == null)
{
var originalData =
await _httpClient
.GetFromJsonAsync<Item[]>(pathToFakeData);
await _localStorageService.SetItemAsync("data", originalData);
}
return (await _localStorageService.GetItemAsync<Item[]>("data")).Length;
}
public async Task<List<Item>> List(int currentPage, int pageSize)
{
if (await _localStorageService.GetItemAsync<Item[]>("data") == null)
{
var originalData =
await _httpClient
.GetFromJsonAsync<Item[]>(pathToFakeData);
await _localStorageService.SetItemAsync("data", originalData);
}
return (await _localStorageService.GetItemAsync<Item[]>("data")).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList();
}
}
}

@ -0,0 +1,11 @@
using blazor_lab.Models;
namespace blazor_lab.Services
{
public interface IDataService
{
Task Add(ItemModel itemModel);
Task<int> Count();
Task<List<Item>> List(int currentPage, int pageSize);
}
}

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Loading…
Cancel
Save