dotnetcore / osharp

OSharp是一个基于.Net6.0的快速开发框架,框架对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、功能权限、数据权限等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net 框架更易于应用到实际项目开发中。
Apache License 2.0
2.77k stars 748 forks source link

给种子数据基类SeedDataInitializerBase.SeedData添加ScopedProvider #231

Closed gmf520 closed 3 years ago

gmf520 commented 3 years ago

您的功能请求与现有问题有关吗?请描述

给初始化种子基类SeedDataInitializerBase的SeedData添加 ScopedProvider,方便在构建种子数据时拉取需要的父数据

old:

public abstract class SeedDataInitializerBase<TEntity, TKey>
{
        public void Initialize()
        {
            TEntity[] entities = SeedData();
            SyncToDatabase(entities);
        }

        protected abstract TEntity[] SeedData();

        //...
}

new:

public abstract class SeedDataInitializerBase<TEntity, TKey>
{
        public void Initialize()
        {
            _rootProvider.ExecuteScopedWork(provider =>
            {
                TEntity[] entities = SeedData(provider);
                SyncToDatabase(entities, provider);
                _logger.LogInformation($"同步 {entities.Length} 个“{typeof(TEntity)}”种子数据到数据库");
            });
        }

        protected abstract TEntity[] SeedData(IServiceProvider scopedProvider);

        //...
}

应用:

public class CodeModuleSeedDataInitializer : SeedDataInitializerBase<CodeModule, Guid>
{
    //...

    /// <summary>重写以提供要初始化的种子数据</summary>
    /// <returns></returns>
    protected override CodeModule[] SeedData(IServiceProvider scopedProvider)
    {
        IRepository<CodeProject, Guid> repository = scopedProvider.GetRequiredService<IRepository<CodeProject, Guid>>();
        CodeProject project = repository.GetFirst(m => m.Name == "示例项目");
        return new[]
        {
            new CodeModule(){Name = "Identity", Display = "身份认证", Order = 1, ProjectId = project.Id},
            new CodeModule(){Name = "Auth", Display = "权限授权", Order = 2, ProjectId = project.Id},
            new CodeModule(){Name = "Infos", Display = "信息", Order = 3, ProjectId = project.Id},
        };
    }

    //...
}