From 878caabb9501dc343102d84f320c8b9f0d99e68e Mon Sep 17 00:00:00 2001 From: hello Date: Sat, 2 Mar 2024 09:50:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E4=BA=8E=E7=94=9F=E6=88=90=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E6=95=B0=E6=8D=AE=E7=9A=84=E6=8F=90=E4=BE=9B=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataSeeding/User2DataSeedingProvider.cs | 27 +++++++++++++ .../DataSeeding/UserDataSeedingProvider.cs | 25 ++++++++++++ src/HelloShop.IdentityService/Program.cs | 6 +++ .../Extensions/DataSeedingExtensions.cs | 40 +++++++++++++++++++ .../Infrastructure/IDataSeedingProvider.cs | 15 +++++++ 5 files changed, 113 insertions(+) create mode 100644 src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs create mode 100644 src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs create mode 100644 src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs create mode 100644 src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs diff --git a/src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs b/src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs new file mode 100644 index 0000000..f615bf8 --- /dev/null +++ b/src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs @@ -0,0 +1,27 @@ +using HelloShop.IdentityService.Entities; +using HelloShop.IdentityService.EntityFrameworks; +using HelloShop.ServiceDefaults.Infrastructure; + +namespace HelloShop.IdentityService.DataSeeding +{ + public class User2DataSeedingProvider : IDataSeedingProvider + { + public async Task SeedingAsync(IServiceProvider serviceProvider) + { + var dbContext = serviceProvider.GetRequiredService(); + + var guestUser = dbContext.Set().SingleOrDefault(x => x.UserName == "guest2"); + + if (guestUser is null) + { + await dbContext.Set().AddAsync(new User + { + UserName = "guest2", + PasswordHash = "AQAAAAEAACcQAAAAEJ" + }); + + await dbContext.SaveChangesAsync(); + } + } + } +} diff --git a/src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs b/src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs new file mode 100644 index 0000000..0bc0e4c --- /dev/null +++ b/src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs @@ -0,0 +1,25 @@ +using HelloShop.IdentityService.Entities; +using HelloShop.IdentityService.EntityFrameworks; +using HelloShop.ServiceDefaults.Infrastructure; + +namespace HelloShop.IdentityService.DataSeeding +{ + public class UserDataSeedingProvider(IdentityServiceDbContext dbContext) : IDataSeedingProvider + { + public async Task SeedingAsync(IServiceProvider serviceProvider) + { + var guestUser = dbContext.Set().SingleOrDefault(x => x.UserName == "guest"); + + if (guestUser is null) + { + await dbContext.Set().AddAsync(new User + { + UserName = "guest", + PasswordHash = "AQAAAAEAACcQAAAAEJ" + }); + + await dbContext.SaveChangesAsync(); + } + } + } +} diff --git a/src/HelloShop.IdentityService/Program.cs b/src/HelloShop.IdentityService/Program.cs index 8d62b4d..54e8ab7 100644 --- a/src/HelloShop.IdentityService/Program.cs +++ b/src/HelloShop.IdentityService/Program.cs @@ -1,5 +1,7 @@ using HelloShop.IdentityService.Constants; +using HelloShop.IdentityService.DataSeeding; using HelloShop.IdentityService.EntityFrameworks; +using HelloShop.ServiceDefaults.Extensions; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); @@ -18,6 +20,8 @@ builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString(DbConstants.ConnectionStringName)); }); +builder.Services.AddDataSeedingProviders(); + var app = builder.Build(); app.MapDefaultEndpoints(); @@ -35,4 +39,6 @@ app.UseAuthorization(); app.MapControllers(); +app.UseDataSeedingProviders(); + app.Run(); diff --git a/src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs b/src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs new file mode 100644 index 0000000..f927104 --- /dev/null +++ b/src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs @@ -0,0 +1,40 @@ +using HelloShop.ServiceDefaults.Infrastructure; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace HelloShop.ServiceDefaults.Extensions +{ + public static class DataSeedingExtensions + { + public static IServiceCollection AddDataSeedingProviders(this IServiceCollection services, Assembly? assembly = null) + { + assembly ??= Assembly.GetCallingAssembly(); + + var dataSeedProviders = assembly.ExportedTypes.Where(t => t.IsAssignableTo(typeof(IDataSeedingProvider)) && t.IsClass); + + dataSeedProviders.ToList().ForEach(t => services.AddTransient(typeof(IDataSeedingProvider), t)); + + return services; + } + + public static IApplicationBuilder UseDataSeedingProviders(this IApplicationBuilder app) + { + using var serviceScope = app.ApplicationServices.CreateScope(); + + var dataSeedingProviders = serviceScope.ServiceProvider.GetServices().OrderBy(x=>x.Order); + + foreach (var dataSeedingProvider in dataSeedingProviders) + { + dataSeedingProvider.SeedingAsync(serviceScope.ServiceProvider).Wait(); + } + + return app; + } + } +} diff --git a/src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs b/src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs new file mode 100644 index 0000000..302be74 --- /dev/null +++ b/src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HelloShop.ServiceDefaults.Infrastructure +{ + public interface IDataSeedingProvider + { + int Order => default; + + Task SeedingAsync(IServiceProvider serviceProvider); + } +}