在前面我们基本把应用框架的基础设施搭建完成。接下来我们就得着手处理一下种子数据的问题。
在一个基础框架里面,种子数据很重要,比如一些基础数据,初始用户等等,这些都需要初始化,否则程序启动却无法使用就很尴尬了。
IDataSeeder
首先定义一个种子数据接口
using Wheel.DependencyInjection;
namespace Wheel.DataSeeders
{
public interface IDataSeeder : ITransientDependency
{
Task Seed(CancellationToken cancellationToken = default);
}
}
接下来所有的种子数据实现都需要继承这个接口。
DataSeederExtensions
封装一个扩展方法,获取所有IDataSeeder的实现,并执行数据初始化。
namespace Wheel.DataSeeders
{
public static class DataSeederExtensions
{
public static async Task SeedData(this IApplicationBuilder app)
{
var dataSeeders = app.ApplicationServices.GetServices();
foreach (var dataSeeder in dataSeeders)
{
await dataSeeder.Seed();
}
return app;
}
}
}
在Program中添加代码
var app = builder.Build();
//初始化种子信息
await app.SeedData();
这样就初步完成了种子数据的配置。
实现种子数据
接下来就实现一些种子数据。
用户角色种子数据
IdentityDataSeeder
using Microsoft.Asp服务器托管网NetCore.Identity;
using Wheel.Domain;
using Wheel.Domain.Identity;
namespace Wheel.DataSeeders.Identity
{
public class IdentityDataSeeder : IDataSeeder
{
private readonly IBasicRepository _roleRepository;
private readonly IBasicRepository _userRepository;
private readonly UserManager _userManager;
private readonly IUserStore _userStore;
private readonly RoleManager _roleManager;
public IdentityDataSeeder(IBasicRepository roleRepository, IBasic服务器托管网Repository userRepository, UserManager userManager, IUserStore userStore, RoleManager roleManager)
{
_roleRepository = roleRepository;
_userRepository = userRepository;
_userManager = userManager;
_userStore = userStore;
_roleManager = roleManager;
}
public async Task Seed(CancellationToken cancellationToken = default)
{
if (!await _roleRepository.AnyAsync(a => a.Name == "admin"))
{
await _roleManager.CreateAsync(new Role("admin", Enums.RoleType.Admin));
}
if (!await _roleRepository.AnyAsync(a => a.Name == "user"))
{
await _roleManager.CreateAsync(new Role("user", Enums.RoleType.App));
}
if (!await _userRepository.AnyAsync(a => a.UserName == "admin"))
{
var adminUser = new User();
await _userStore.SetUserNameAsync(adminUser, "admin", cancellationToken);
var emailStore = (IUserEmailStore)_userStore;
await emailStore.SetEmailAsync(adminUser, "136590076@qq.com", cancellationToken);
await _userManager.CreateAsync(adminUser, "Wheel@2023");
await _userManager.AddToRoleAsync(adminUser, "admin");
await _userManager.UpdateAsync(adminUser);
}
}
}
}
这里初始化一个普通User角色和管理后台admin角色,以及一个admin角色的账号。
多语言种子数据
LocalizationDataSeeder
using Wheel.Domain;
using Wheel.Domain.Localization;
namespace Wheel.DataSeeders.Localization
{
public class LocalizationDataSeeder : IDataSeeder
{
private readonly IBasicRepository _localizationCultureRepository;
public LocalizationDataSeeder(IBasicRepository localizationCultureRepository)
{
_localizationCultureRepository = localizationCultureRepository;
}
public async Task Seed(CancellationToken cancellationToken = default)
{
if (!(await _localizationCultureRepository.AnyAsync(cancellationToken)))
{
await _localizationCultureRepository.InsertAsync(new LocalizationCulture() { Name = "en" }, true);
await _localizationCultureRepository.InsertAsync(new LocalizationCulture() { Name = "zh-CN"}, true);
}
}
}
}
这里给多语言初始化两种国家语言。
菜单种子
MenuDataSeeder
using Wheel.Domain;
using Wheel.Domain.Menus;
namespace Wheel.DataSeeders.Identity
{
public class MenuDataSeeder : IDataSeeder
{
private readonly IBasicRepository
这里菜单初始化基础管理后台页面所需的菜单。
启动程序后,打开数据库
可以看到数据初始化成功。
这样就轻轻松松完成了我们种子数据的实现。
轮子仓库地址https://github.com/Wheel-Framework/Wheel
欢迎进群催更。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 2、Keepalived配置说明:全局配置和虚拟路由器配置
keepalived配置说明 配置文件组成有三块,最主要的是前两块 GLOBAL CONFIGURATION #全局配置(集群服务共享的) Global definitions:定义邮件配置,route_id,vrrp配置,多播地址等 VRRP CONFIGU…