commits列表 30 项
提交内容 25/25
调整案例!LazyServiceProvider
example/ExampleApeart.Application.Contracts/eventmodels/EventAfterGradeCreateModel.cs
diff --git a/example/ExampleApeart.Application.Contracts/eventmodels/EventAfterGradeCreateModel.cs b/example/ExampleApeart.Application.Contracts/eventmodels/EventAfterGradeCreateModel.cs
new file mode 100644
index 0000000..ed82e25
--- /dev/null
+++ b/example/ExampleApeart.Application.Contracts/eventmodels/EventAfterGradeCreateModel.cs
@@ -0,0 +1,20 @@
+using PasteApeart.Application.Contracts;
+
+namespace ExampleApeart.Application.Contracts.eventmodels
+{
+    /// <summary>
+    /// 角色创建后 案例事件,角色创建后
+    /// </summary>
+    public class EventAfterGradeCreateModel : AbsEventModel
+    {
+        /// <summary>
+        /// 角色
+        /// </summary>
+        public int GradeId { get; set; }
+
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public int CreateUserId { get; set; }
+    }
+}
example/ExampleApeart.Application.Contracts/eventmodels/EventAfterUserCreateModel.cs
diff --git a/example/ExampleApeart.Application.Contracts/eventmodels/EventAfterUserCreateModel.cs b/example/ExampleApeart.Application.Contracts/eventmodels/EventAfterUserCreateModel.cs
new file mode 100644
index 0000000..05c0fc3
--- /dev/null
+++ b/example/ExampleApeart.Application.Contracts/eventmodels/EventAfterUserCreateModel.cs
@@ -0,0 +1,22 @@
+using PasteApeart.Application.Contracts;
+using PasteApeart.Helper;
+
+namespace ExampleApeart.Application.Contracts.eventmodels
+{
+    /// <summary>
+    /// 用户创建后 案例,用户创建后
+    /// </summary>
+    public class EventAfterUserCreateModel : AbsEventModel
+    {
+        /// <summary>
+        /// 账号
+        /// </summary>
+        [PasteOuter("userInfo")]
+        public int UserId { get; set; }
+
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public int CreateUserId { get; set; }
+    }
+}
example/ExampleApeart.Application.Contracts/usermodels/RoleInfoDto.cs
diff --git a/example/ExampleApeart.Application.Contracts/usermodels/RoleInfoDto.cs b/example/ExampleApeart.Application.Contracts/usermodels/RoleInfoDto.cs
index 813d49c..fb54de7 100644
--- a/example/ExampleApeart.Application.Contracts/usermodels/RoleInfoDto.cs
+++ b/example/ExampleApeart.Application.Contracts/usermodels/RoleInfoDto.cs
@@ -175,11 +175,11 @@ namespace ExampleApeart.usermodels
         [Description("排序串")]
         public string SortStr { get; set; }
 
-        ///<summary>
-        ///根级
-        ///</summary>
-        [Description("根级")]
-        public int RootId { get; set; }
+        /////<summary>
+        /////根级
+        /////</summary>
+        //[Description("根级")]
+        //public int RootId { get; set; }
 
         ///<summary>
         ///父级串
example/ExampleApeart.Application.Contracts/usermodels/UserInfoDto.cs
diff --git a/example/ExampleApeart.Application.Contracts/usermodels/UserInfoDto.cs b/example/ExampleApeart.Application.Contracts/usermodels/UserInfoDto.cs
index e188f69..4569f9c 100644
--- a/example/ExampleApeart.Application.Contracts/usermodels/UserInfoDto.cs
+++ b/example/ExampleApeart.Application.Contracts/usermodels/UserInfoDto.cs
@@ -1,4 +1,3 @@
-using PasteApeart;
 using PasteApeart.Applciation.Contracts.EntityDto;
 using PasteApeart.Application.Contracts;
 using PasteApeart.Helper;
@@ -37,7 +36,7 @@ namespace ExampleApeart.usermodels
         [MaxLength(32)]
         [Required]
         [Description("用户名")]
-        public string UserName { get; set; } = "";
+        public string Name { get; set; } = "";
 
         ///<summary>
         ///描述
@@ -52,7 +51,7 @@ namespace ExampleApeart.usermodels
         [MaxLength(128)]
         [PasteImage(1, "head", "60*60")]
         [Description("头像")]
-        public string UserHead { get; set; } = "";
+        public string Head { get; set; } = "";
 
         ///<summary>
         ///状态
@@ -109,12 +108,12 @@ namespace ExampleApeart.usermodels
         #endregion
 
 
-        /// <summary>
-        /// 扩展 包含的角色列表
-        /// </summary>
-        [PasteHidden]
-        [Description("扩展 包含的角色列表")]
-        public List<GradeInfoListDto> Grades { get; set; }
+        ///// <summary>
+        ///// 扩展 包含的角色列表
+        ///// </summary>
+        //[PasteHidden]
+        //[Description("扩展 包含的角色列表")]
+        //public List<GradeInfoListDto> Grades { get; set; }
 
     }
 
@@ -144,14 +143,14 @@ namespace ExampleApeart.usermodels
         ///</summary>
         [PasteSearch]
         [Description("用户名")]
-        public string UserName { get; set; }
+        public string Name { get; set; }
 
         ///<summary>
         ///头像
         ///</summary>
         [PasteImage]
         [Description("头像")]
-        public string UserHead { get; set; }
+        public string Head { get; set; }
 
         ///<summary>
         ///创建日期
@@ -200,23 +199,17 @@ namespace ExampleApeart.usermodels
         /// </summary>
         public int Id { get; set; }
 
-        /// <summary>
-        /// 用户名
-        /// </summary>
-        [Description("用户名")]
-        public string Name { get { return UserName; } }
-
         ///<summary>
         ///用户名
         ///</summary>
         [Description("用户名")]
-        public string UserName { get; set; }
+        public string Name { get; set; }
 
         ///<summary>
         ///头像
         ///</summary>
         [Description("头像")]
-        public string UserHead { get; set; }
+        public string Head { get; set; }
 
     }
 
@@ -235,13 +228,13 @@ namespace ExampleApeart.usermodels
         ///用户名
         ///</summary>
         [Description("用户名")]
-        public string UserName { get; set; }
+        public string Name { get; set; }
 
         ///<summary>
         ///头像
         ///</summary>
         [Description("头像")]
-        public string UserHead { get; set; }
+        public string Head { get; set; }
 
     }
 
example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
diff --git a/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs b/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
index 2b90690..ab81e7a 100644
--- a/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
+++ b/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
@@ -1,10 +1,11 @@
 using ExampleApeart.Application;
 using ExampleApeart.Handler;
-using ExampleApeart.Handler.eventmodels;
+using Mapster;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
 using PasteApeart;
 using PasteApeart.Application.Contracts;
+using PasteApeart.Handler;
 using PasteApeart.Handler.Extensions;
 using PasteApeart.Helper;
 using System.Linq.Dynamic.Core;
@@ -104,7 +105,7 @@ namespace ExampleApeart.usermodels
                              SortStr = a.SortStr,
                              FatherStr = a.FatherStr,
                              Level = a.Level,
-                             RootId = a.RootId,
+                             //RootId = a.RootId,
                              Sort = a.Sort,
                              ExtendRole = rol != null ? new RoleShortModel
                              {
@@ -303,10 +304,15 @@ namespace ExampleApeart.usermodels
         /// <returns></returns>
         [HttpPost]
         [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "root", "root" })]
-        public async Task<RoleInfoDto> CreateItemAsync(RoleInfoAddDto input)
+        public async Task<RoleInfoListDto> CreateItemAsync(RoleInfoAddDto input)
         {
-            //return await _userHandler.RoleAdd(_dbContext, input);
-            return await LevelHandler.RoleAdd(_dbContext, input);
+            var info = input.Adapt<RoleInfo>();
+            _dbContext.Add(info);
+            await _dbContext.SaveChangesAsync();
+            var _levelHandler = LazyServiceProvider.GetRequiredService<ILevelHandler>();
+            await _levelHandler.AfterAddAsync<RoleInfo, int>(info);
+            await _dbContext.SaveChangesAsync();
+            return info.Adapt<RoleInfoListDto>();
         }
 
         /// <summary>
@@ -316,11 +322,19 @@ namespace ExampleApeart.usermodels
         /// <returns></returns>
         [HttpPost]
         [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "root", "root" })]
-        public async Task<RoleInfoDto> UpdateItemAsync(RoleInfoUpdateDto input)
+        public async Task<RoleInfoListDto> UpdateItemAsync(RoleInfoUpdateDto input)
         {
-            //return await _userHandler.RoleUpdate(_dbContext, input);
+            var info = await _dbContext.RoleInfo.Where(x => x.Id == input.Id).FirstOrDefaultAsync();
+            if (info == null) { return null; }
+            var oldFatherStr = info.FatherStr;
+            var oldLevel = info.Level;
+            input.Adapt(info);
+            await _dbContext.SaveChangesAsync();
+            var _levelHandler = LazyServiceProvider.GetRequiredService<ILevelHandler>();
+            await _levelHandler.AfterUpdateAsync<RoleInfo, int>(info, oldFatherStr, oldLevel);
+            await _dbContext.SaveChangesAsync();
+            return info.Adapt<RoleInfoListDto>();
 
-            return await LevelHandler.RoleUpdate(_dbContext, input);
         }
 
         ///// <summary>
example/ExampleApeart.Application/usermodels/UserInfoAppService.cs
diff --git a/example/ExampleApeart.Application/usermodels/UserInfoAppService.cs b/example/ExampleApeart.Application/usermodels/UserInfoAppService.cs
index bb6feb5..3f3959b 100644
--- a/example/ExampleApeart.Application/usermodels/UserInfoAppService.cs
+++ b/example/ExampleApeart.Application/usermodels/UserInfoAppService.cs
@@ -49,13 +49,13 @@ namespace ExampleApeart.usermodels
             }
             //var dto = ObjectMapper.Map<UserInfo, UserInfoUpdateDto>(_info);
             var dto = _info.Adapt<UserInfoUpdateDto>();
-            var _query_gradeid = _dbContext.UserGrade.Where(x => x.UserId == _info.Id).Select(x => x.GradeId);
-            var grades = await _dbContext.GradeInfo.Where(x => _query_gradeid.Contains(x.Id)).AsNoTracking().ToListAsync();
-            if (grades != null && grades.Count > 0)
-            {
-                //dto.Grades = ObjectMapper.Map<List<GradeInfo>, List<GradeInfoListDto>>(grades);
-                dto.Grades = grades.Adapt<List<GradeInfoListDto>>();
-            }
+            //var _query_gradeid = _dbContext.UserGrade.Where(x => x.UserId == _info.Id).Select(x => x.GradeId);
+            //var grades = await _dbContext.GradeInfo.Where(x => _query_gradeid.Contains(x.Id)).AsNoTracking().ToListAsync();
+            //if (grades != null && grades.Count > 0)
+            //{
+            //    //dto.Grades = ObjectMapper.Map<List<GradeInfo>, List<GradeInfoListDto>>(grades);
+            //    dto.Grades = grades.Adapt<List<GradeInfoListDto>>();
+            //}
 
             dto.PassWord = "";//密码只有重置,没有修改
             var _dataModel = BuilderHelper.AttributeReadModelProperty<UserInfoUpdateDto>(dto);
example/ExampleApeart.Domain/enummodels/ILevelEntity.cs
diff --git a/example/ExampleApeart.Domain/enummodels/ILevelEntity.cs b/example/ExampleApeart.Domain/enummodels/ILevelEntity.cs
index 8b9df44..91c5be0 100644
--- a/example/ExampleApeart.Domain/enummodels/ILevelEntity.cs
+++ b/example/ExampleApeart.Domain/enummodels/ILevelEntity.cs
@@ -1,50 +1,50 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace ExampleApeart
-{
-    /// <summary>
-    /// 支持 非递归多级查询,支持多级排序
-    /// </summary>
-    public interface ILevelEntity
-    {
-        /// <summary>
-        /// 标识
-        /// </summary>
-        int Id { get; set; }
-
-        /// <summary>
-        /// 排序串
-        /// </summary>
-        string SortStr { get; set; }
-
-        /// <summary>
-        /// 层级
-        /// </summary>
-        int Level { get; set; }
-
-        /// <summary>
-        /// 排序 层级内排序
-        /// </summary>
-        int Sort { get; set; }
-
-        /// <summary>
-        /// 父级
-        /// </summary>
-        int FatherId { get; set; }
-
-        /// <summary>
-        /// 父级串 替换递归查询用
-        /// </summary>
-        string FatherStr { get; set; }
-
-        /// <summary>
-        /// 根级 大块
-        /// </summary>
-        int RootId { get; set; }
-    }
-
-}
+//using System;
+//using System.Collections.Generic;
+//using System.Linq;
+//using System.Text;
+//using System.Threading.Tasks;
+
+//namespace ExampleApeart
+//{
+//    /// <summary>
+//    /// 支持 非递归多级查询,支持多级排序
+//    /// </summary>
+//    public interface ILevelEntity
+//    {
+//        /// <summary>
+//        /// 标识
+//        /// </summary>
+//        int Id { get; set; }
+
+//        /// <summary>
+//        /// 排序串
+//        /// </summary>
+//        string SortStr { get; set; }
+
+//        /// <summary>
+//        /// 层级
+//        /// </summary>
+//        int Level { get; set; }
+
+//        /// <summary>
+//        /// 排序 层级内排序
+//        /// </summary>
+//        int Sort { get; set; }
+
+//        /// <summary>
+//        /// 父级
+//        /// </summary>
+//        int FatherId { get; set; }
+
+//        /// <summary>
+//        /// 父级串 替换递归查询用
+//        /// </summary>
+//        string FatherStr { get; set; }
+
+//        /// <summary>
+//        /// 根级 大块
+//        /// </summary>
+//        int RootId { get; set; }
+//    }
+
+//}
example/ExampleApeart.Domain/template/config.json
diff --git a/example/ExampleApeart.Domain/template/config.json b/example/ExampleApeart.Domain/template/config.json
index 0783ea4..2cf5e96 100644
--- a/example/ExampleApeart.Domain/template/config.json
+++ b/example/ExampleApeart.Domain/template/config.json
@@ -38,7 +38,7 @@
   "attribute": {
     "ignore": [ "Comment", "Display", "Decription", "Index", "DefaultValue", "Column", "NotMapped" ], //表示忽略哪些来自Domain的特性
     "all": {
-      "*:!list:UserId": "[PasteOuter(\"userInfo\",\"extendUser\",\"id\",\"userName\")]", //表示这个字段UserId需要添加这个特性多个之间用::隔开 示例:[PasteLeft]::[PasteHidden]
+      "*:!list:UserId": "[PasteOuter(\"userInfo\",\"extendUser\",\"id\",\"name\")]", //表示这个字段UserId需要添加这个特性多个之间用::隔开 示例:[PasteLeft]::[PasteHidden]
       "*:all:UserId": "[PasteShort(\"UserInfo\",\"ExtendUser\",\"ToUserShort()\",\"ToQueryUserShort()\")]", //表示这个字段UserId需要添加这个特性多个之间用::隔开 示例:[PasteLeft]::[PasteHidden]
       "*:!add:ExtendUser": "[PasteDisplay]",
       "*:list:UserId": "[PasteHidden]",
example/ExampleApeart.Domain/usermodels/GradeRole.cs
diff --git a/example/ExampleApeart.Domain/usermodels/GradeRole.cs b/example/ExampleApeart.Domain/usermodels/GradeRole.cs
index ebd1e4c..ac6577f 100644
--- a/example/ExampleApeart.Domain/usermodels/GradeRole.cs
+++ b/example/ExampleApeart.Domain/usermodels/GradeRole.cs
@@ -6,9 +6,9 @@ using PasteApeart.Helper;
 namespace ExampleApeart.usermodels
 {
     /// <summary>
-    /// 角色绑定权限
+    /// 角色权限
     /// </summary>
-    [Comment("角色绑定权限")]
+    [Comment("角色权限")]
     public class GradeRole : Entity<int>
     {
         /// <summary>
example/ExampleApeart.Domain/usermodels/RoleInfo.cs
diff --git a/example/ExampleApeart.Domain/usermodels/RoleInfo.cs b/example/ExampleApeart.Domain/usermodels/RoleInfo.cs
index 47e4569..8a0db7c 100644
--- a/example/ExampleApeart.Domain/usermodels/RoleInfo.cs
+++ b/example/ExampleApeart.Domain/usermodels/RoleInfo.cs
@@ -9,7 +9,7 @@ namespace ExampleApeart.usermodels
     /// </summary>
     [PasteAuth("*", "root", "root")]
     [PasteShortModel("RoleShort", "ToRoleShort", "Id", "Name")]
-    public class RoleInfo : ILevelEntity<int>, ILevelEntity
+    public class RoleInfo : ILevelEntity<int>, IEntity
     {
         /// <summary>
         /// 标识
@@ -55,7 +55,12 @@ namespace ExampleApeart.usermodels
         /// <summary>
         /// 权限类型 0权限1菜单2按钮
         /// </summary>
-        public EnumRoleType RoleType { get; set; }
+        public EnumRoleType RoleType { get; set; } = EnumRoleType.Menu;
+
+        /// <summary>
+        /// 默认权限 是否是默认权限
+        /// </summary>
+        public bool IsDefault { get; set; } = false;
 
         /// <summary>
         /// 状态
@@ -83,10 +88,10 @@ namespace ExampleApeart.usermodels
         [MaxLength(20)]
         public string SortStr { get; set; } = "";
 
-        /// <summary>
-        /// 
-        /// </summary>
-        public int RootId { get; set; }
+        ///// <summary>
+        ///// 
+        ///// </summary>
+        //public int RootId { get; set; }
 
         /// <summary>
         /// 
example/ExampleApeart.Domain/usermodels/UserInfo.cs
diff --git a/example/ExampleApeart.Domain/usermodels/UserInfo.cs b/example/ExampleApeart.Domain/usermodels/UserInfo.cs
index ce57f2b..e6a0c67 100644
--- a/example/ExampleApeart.Domain/usermodels/UserInfo.cs
+++ b/example/ExampleApeart.Domain/usermodels/UserInfo.cs
@@ -11,20 +11,20 @@ namespace ExampleApeart.usermodels
     [Comment("登录用户表")]
     [PasteAuth("*", "root", "root")]
     [Index(nameof(Email), IsUnique = true)]
-    [PasteShortModel("UserShort", "ToUserShort", "Id", "UserName")]
+    [PasteShortModel("UserShort", "ToUserShort", "Id", "Name")]
     public class UserInfo : Entity<int>
     {
         /// <summary>
         /// 用户名
         /// </summary>
         [MaxLength(32)]
-        public string UserName { get; set; }
+        public string Name { get; set; }
 
         /// <summary>
         /// 头像
         /// </summary>
         [MaxLength(128)]
-        public string UserHead { get; set; }
+        public string Head { get; set; }
 
         /// <summary>
         /// 创建日期
example/ExampleApeart.Handler/common/LinqExtend.cs
diff --git a/example/ExampleApeart.Handler/common/LinqExtend.cs b/example/ExampleApeart.Handler/common/LinqExtend.cs
index d549001..6401fd1 100644
--- a/example/ExampleApeart.Handler/common/LinqExtend.cs
+++ b/example/ExampleApeart.Handler/common/LinqExtend.cs
@@ -42,8 +42,8 @@ namespace ExampleApeart.Handler
             return new UserShort
             {
                 Id = user.Id,
-                UserHead = user.UserHead,
-                UserName = user.UserName,
+                Head = user.Head,
+                Name = user.Name,
             };
         }
 
@@ -98,8 +98,8 @@ namespace ExampleApeart.Handler
             return query.Select(x => new UserShort
             {
                 Id = x.Id,
-                UserHead = x.UserHead,
-                UserName = x.UserName
+                Head = x.Head,
+                Name = x.Name
             });
         }
 
example/ExampleApeart.Handler/modelhandler/LevelHandler.cs
diff --git a/example/ExampleApeart.Handler/modelhandler/LevelHandler.cs b/example/ExampleApeart.Handler/modelhandler/LevelHandler.cs
index 9d4dc68..60b9eac 100644
--- a/example/ExampleApeart.Handler/modelhandler/LevelHandler.cs
+++ b/example/ExampleApeart.Handler/modelhandler/LevelHandler.cs
@@ -1,320 +1,320 @@
-using ExampleApeart.Application.Contracts;
-using ExampleApeart.EntityFrameworkCore;
-using ExampleApeart.usermodels;
-using Mapster;
-using Microsoft.EntityFrameworkCore;
-using PasteApeart.Application.Contracts;
+//using ExampleApeart.Application.Contracts;
+//using ExampleApeart.EntityFrameworkCore;
+//using ExampleApeart.usermodels;
+//using Mapster;
+//using Microsoft.EntityFrameworkCore;
+//using PasteApeart.Application.Contracts;
 
-namespace ExampleApeart.Handler
-{
-    /// <summary>
-    /// 多层级 非递归多层级新增和更新
-    /// </summary>
-    public class LevelHandler
-    {
-        /// <summary>
-        /// 这是一个新增案例
-        ///</summary>
-        /// <param name="input"></param>
-        /// <returns></returns>
-        public static async Task<RoleInfoDto> RoleAdd(IExampleApeartDbContext _dbContext, RoleInfoAddDto input)
-        {
-            if (input.Sort == 0)
-            {
-                var _max = await _dbContext.RoleInfo.Where(x => x.FatherId == input.FatherId)
-                    .OrderByDescending(x => x.Sort)
-                    .Select(x => x.Sort)
-                    .FirstOrDefaultAsync();
-                input.Sort = _max + 10;
-            }
+//namespace ExampleApeart.Handler
+//{
+//    /// <summary>
+//    /// 多层级 非递归多层级新增和更新
+//    /// </summary>
+//    public class LevelHandler
+//    {
+//        /// <summary>
+//        /// 这是一个新增案例
+//        ///</summary>
+//        /// <param name="input"></param>
+//        /// <returns></returns>
+//        public static async Task<RoleInfoDto> RoleAdd(IExampleApeartDbContext _dbContext, RoleInfoAddDto input)
+//        {
+//            if (input.Sort == 0)
+//            {
+//                var _max = await _dbContext.RoleInfo.Where(x => x.FatherId == input.FatherId)
+//                    .OrderByDescending(x => x.Sort)
+//                    .Select(x => x.Sort)
+//                    .FirstOrDefaultAsync();
+//                input.Sort = _max + 10;
+//            }
 
-            if (input.RoleType == 0)
-            {
-                if (String.IsNullOrEmpty(input.Model) || String.IsNullOrEmpty(input.Role))
-                {
-                    throw new PasteCodeException("新增权限的时候,模块和权限必填,请重新填写!");
-                }
-                var find = await _dbContext.RoleInfo.Where(x => x.RoleType == 0 && x.Model == input.Model && x.Role == input.Role).Select(x => x.Id).FirstOrDefaultAsync();
-                if (find > 0)
-                {
-                    throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
-                }
-            }
-            if (input.RoleType == EnumRoleType.Menu)
-            {
-                if (!string.IsNullOrEmpty(input.Path))
-                {
-                    if (input.FatherId == 0)
-                    {
-                        throw new PasteCodeException("非一级菜单,父级必选,请重新选择!");
-                    }
-                    var find = await _dbContext.RoleInfo.Where(x => x.RoleType == EnumRoleType.Menu && x.Path == input.Path).Select(x => x.Id).FirstOrDefaultAsync();
-                    if (find > 0)
-                    {
-                        throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
-                    }
-                }
-            }
+//            if (input.RoleType == 0)
+//            {
+//                if (String.IsNullOrEmpty(input.Model) || String.IsNullOrEmpty(input.Role))
+//                {
+//                    throw new PasteCodeException("新增权限的时候,模块和权限必填,请重新填写!");
+//                }
+//                var find = await _dbContext.RoleInfo.Where(x => x.RoleType == 0 && x.Model == input.Model && x.Role == input.Role).Select(x => x.Id).FirstOrDefaultAsync();
+//                if (find > 0)
+//                {
+//                    throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
+//                }
+//            }
+//            if (input.RoleType == EnumRoleType.Menu)
+//            {
+//                if (!string.IsNullOrEmpty(input.Path))
+//                {
+//                    if (input.FatherId == 0)
+//                    {
+//                        throw new PasteCodeException("非一级菜单,父级必选,请重新选择!");
+//                    }
+//                    var find = await _dbContext.RoleInfo.Where(x => x.RoleType == EnumRoleType.Menu && x.Path == input.Path).Select(x => x.Id).FirstOrDefaultAsync();
+//                    if (find > 0)
+//                    {
+//                        throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
+//                    }
+//                }
+//            }
 
-            //这里最好用事务包裹下
-            //var info = ObjectMapper.Map<RoleInfoAddDto, RoleInfo>(input);
-            var info = input.Adapt<RoleInfo>();
-            info.IsEnable = true;//添加自定义
-            _dbContext.Add(info);
-            await _dbContext.SaveChangesAsync();
-            await AfterAdd(_dbContext, nameof(RoleInfo), info);
-            await _dbContext.SaveChangesAsync();
+//            //这里最好用事务包裹下
+//            //var info = ObjectMapper.Map<RoleInfoAddDto, RoleInfo>(input);
+//            var info = input.Adapt<RoleInfo>();
+//            info.IsEnable = true;//添加自定义
+//            _dbContext.Add(info);
+//            await _dbContext.SaveChangesAsync();
+//            await AfterAdd(_dbContext, nameof(RoleInfo), info);
+//            await _dbContext.SaveChangesAsync();
 
-            //var backinfo = ObjectMapper.Map<RoleInfo, RoleInfoDto>(info);
-            var backinfo = info.Adapt<RoleInfoDto>();
-            return backinfo;
-        }
+//            //var backinfo = ObjectMapper.Map<RoleInfo, RoleInfoDto>(info);
+//            var backinfo = info.Adapt<RoleInfoDto>();
+//            return backinfo;
+//        }
 
-        /// <summary>
-        /// 这是一个更新案例
-        ///</summary>
-        /// <param name="input"></param>
-        /// <returns></returns>
-        public static async Task<RoleInfoDto> RoleUpdate(IExampleApeartDbContext _dbContext, RoleInfoUpdateDto input)
-        {
-            if (input.Sort == 0)
-            {
-                var _max = await _dbContext.RoleInfo.Where(x => x.FatherId == input.FatherId)
-                    .OrderByDescending(x => x.Sort)
-                    .Select(x => x.Sort)
-                    .FirstOrDefaultAsync();
-                input.Sort = _max + 10;
-            }
+//        /// <summary>
+//        /// 这是一个更新案例
+//        ///</summary>
+//        /// <param name="input"></param>
+//        /// <returns></returns>
+//        public static async Task<RoleInfoDto> RoleUpdate(IExampleApeartDbContext _dbContext, RoleInfoUpdateDto input)
+//        {
+//            if (input.Sort == 0)
+//            {
+//                var _max = await _dbContext.RoleInfo.Where(x => x.FatherId == input.FatherId)
+//                    .OrderByDescending(x => x.Sort)
+//                    .Select(x => x.Sort)
+//                    .FirstOrDefaultAsync();
+//                input.Sort = _max + 10;
+//            }
 
-            if (input.RoleType == 0)
-            {
-                if (String.IsNullOrEmpty(input.Model) || String.IsNullOrEmpty(input.Role))
-                {
-                    throw new PasteCodeException("新增权限的时候,模块和权限必填,请重新填写!");
-                }
-                var find = await _dbContext.RoleInfo.Where(x => x.RoleType == 0 && x.Model == input.Model && x.Role == input.Role && x.Id != input.Id).Select(x => x.Id).FirstOrDefaultAsync();
-                if (find > 0)
-                {
-                    throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
-                }
-            }
-            if (input.RoleType == EnumRoleType.Menu)
-            {
-                if (!string.IsNullOrEmpty(input.Path))
-                {
-                    if (input.FatherId == 0)
-                    {
-                        throw new PasteCodeException("非一级菜单,父级必选,请重新选择!");
-                    }
-                    var find = await _dbContext.RoleInfo.Where(x => x.RoleType == EnumRoleType.Menu && x.Path == input.Path && x.Id != input.Id).Select(x => x.Id).FirstOrDefaultAsync();
-                    if (find > 0)
-                    {
-                        throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
-                    }
-                }
-            }
+//            if (input.RoleType == 0)
+//            {
+//                if (String.IsNullOrEmpty(input.Model) || String.IsNullOrEmpty(input.Role))
+//                {
+//                    throw new PasteCodeException("新增权限的时候,模块和权限必填,请重新填写!");
+//                }
+//                var find = await _dbContext.RoleInfo.Where(x => x.RoleType == 0 && x.Model == input.Model && x.Role == input.Role && x.Id != input.Id).Select(x => x.Id).FirstOrDefaultAsync();
+//                if (find > 0)
+//                {
+//                    throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
+//                }
+//            }
+//            if (input.RoleType == EnumRoleType.Menu)
+//            {
+//                if (!string.IsNullOrEmpty(input.Path))
+//                {
+//                    if (input.FatherId == 0)
+//                    {
+//                        throw new PasteCodeException("非一级菜单,父级必选,请重新选择!");
+//                    }
+//                    var find = await _dbContext.RoleInfo.Where(x => x.RoleType == EnumRoleType.Menu && x.Path == input.Path && x.Id != input.Id).Select(x => x.Id).FirstOrDefaultAsync();
+//                    if (find > 0)
+//                    {
+//                        throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
+//                    }
+//                }
+//            }
 
-            var info = await _dbContext.RoleInfo.Where(x => x.Id == input.Id).FirstOrDefaultAsync();
-            if (info == null || info == default)
-            {
-                throw new PasteCodeException("需要查询的信息不存在");
-            }
-            //ObjectMapper.Map<RoleInfoUpdateDto, RoleInfo>(input, info);
-            input.Adapt(info);
-            await AfterUpdate(_dbContext, nameof(RoleInfo), info);
-            //var backinfo = ObjectMapper.Map<RoleInfo, RoleInfoDto>(info);?
-            var backinfo = info.Adapt<RoleInfoDto>();
-            await _dbContext.SaveChangesAsync();
-            return backinfo;
-        }
+//            var info = await _dbContext.RoleInfo.Where(x => x.Id == input.Id).FirstOrDefaultAsync();
+//            if (info == null || info == default)
+//            {
+//                throw new PasteCodeException("需要查询的信息不存在");
+//            }
+//            //ObjectMapper.Map<RoleInfoUpdateDto, RoleInfo>(input, info);
+//            input.Adapt(info);
+//            await AfterUpdate(_dbContext, nameof(RoleInfo), info);
+//            //var backinfo = ObjectMapper.Map<RoleInfo, RoleInfoDto>(info);?
+//            var backinfo = info.Adapt<RoleInfoDto>();
+//            await _dbContext.SaveChangesAsync();
+//            return backinfo;
+//        }
 
-        /// <summary>
-        /// 新增后 注意外部要保存下
-        /// </summary>
-        /// <param name="_dbContext"></param>
-        /// <param name="TableName">应该是PropertyName</param>
-        /// <param name="info"></param>
-        public static async Task AfterAdd(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity info)
-        {
-            info.SortStr = info.Sort.ToString().PadLeft(_persize, '0') + "0".PadLeft((_maxlevel - 1) * _persize, '0');
-            if (info.FatherId <= 0)
-            {
-                info.FatherStr = $"{info.Id},";
-                info.RootId = info.Id;
-                return;
-            }
+//        /// <summary>
+//        /// 新增后 注意外部要保存下
+//        /// </summary>
+//        /// <param name="_dbContext"></param>
+//        /// <param name="TableName">应该是PropertyName</param>
+//        /// <param name="info"></param>
+//        public static async Task AfterAdd(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity info)
+//        {
+//            info.SortStr = info.Sort.ToString().PadLeft(_persize, '0') + "0".PadLeft((_maxlevel - 1) * _persize, '0');
+//            if (info.FatherId <= 0)
+//            {
+//                info.FatherStr = $"{info.Id},";
+//                info.RootId = info.Id;
+//                return;
+//            }
 
-            var dbType = _dbContext.GetType();
-            var dbProperty = dbType.GetProperty(TableName);
-            if (dbProperty != null)
-            {
-                var dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
-                if (dbSet != null)
-                {
+//            var dbType = _dbContext.GetType();
+//            var dbProperty = dbType.GetProperty(TableName);
+//            if (dbProperty != null)
+//            {
+//                var dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
+//                if (dbSet != null)
+//                {
 
-                    var father = await dbSet.Where(x => x.Id == info.FatherId).AsNoTracking().FirstOrDefaultAsync();
-                    if (father != null && father != default)
-                    {
-                        info.FatherStr = $"{father.FatherStr}{info.Id},";
-                        info.Level = (father.Level + 1);
-                        info.FatherId = father.Id;
-                        info.RootId = father.RootId != 0 ? father.RootId : father.Id;
-                        BuildSortStr(info, father);
-                    }
-                    else
-                    {
-                        info.FatherId = 0;
-                    }
+//                    var father = await dbSet.Where(x => x.Id == info.FatherId).AsNoTracking().FirstOrDefaultAsync();
+//                    if (father != null && father != default)
+//                    {
+//                        info.FatherStr = $"{father.FatherStr}{info.Id},";
+//                        info.Level = (father.Level + 1);
+//                        info.FatherId = father.Id;
+//                        info.RootId = father.RootId != 0 ? father.RootId : father.Id;
+//                        BuildSortStr(info, father);
+//                    }
+//                    else
+//                    {
+//                        info.FatherId = 0;
+//                    }
 
-                }
-            }
-        }
+//                }
+//            }
+//        }
 
-        /// <summary>
-        /// 更新后 注意外部要保存下
-        /// </summary>
-        /// <param name="_dbContext"></param>
-        /// <param name="TableName">应该是PropertyName</param>
-        /// <param name="info"></param>
-        /// <returns></returns>
-        public static async Task AfterUpdate(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity info)
-        {
-            IQueryable<ILevelEntity> dbSet = null;
-            var dbType = _dbContext.GetType();
-            var dbProperty = dbType.GetProperty(TableName);
-            if (dbProperty != null)
-            {
-                dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
-            }
-            if (dbSet == null)
-            {
-                return;
-            }
-            var old_father_str = info.FatherStr;
-            var _chat_level = info.Level;
+//        /// <summary>
+//        /// 更新后 注意外部要保存下
+//        /// </summary>
+//        /// <param name="_dbContext"></param>
+//        /// <param name="TableName">应该是PropertyName</param>
+//        /// <param name="info"></param>
+//        /// <returns></returns>
+//        public static async Task AfterUpdate(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity info)
+//        {
+//            IQueryable<ILevelEntity> dbSet = null;
+//            var dbType = _dbContext.GetType();
+//            var dbProperty = dbType.GetProperty(TableName);
+//            if (dbProperty != null)
+//            {
+//                dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
+//            }
+//            if (dbSet == null)
+//            {
+//                return;
+//            }
+//            var old_father_str = info.FatherStr;
+//            var _chat_level = info.Level;
 
-            if (info.FatherId != 0)
-            {
-                var father = await dbSet.Where(x => x.Id == info.FatherId).AsNoTracking().FirstOrDefaultAsync();
-                if (father != null && father != default)
-                {
-                    info.Level = father.Level + 1;
-                    info.FatherStr = $"{father.FatherStr}{info.Id},";
-                    info.RootId = father.RootId;
-                    BuildSortStr(info, father);
-                }
-                else
-                {
-                    info.FatherId = 0;
-                    info.FatherStr = $"{info.Id},";
-                    info.Level = 0;
-                    info.RootId = info.Id;
-                    BuildSortStr(info, null);
-                }
-            }
-            else
-            {
-                info.FatherId = 0;
-                info.FatherStr = $"{info.Id},";
-                info.Level = 0;
-                info.RootId = info.Id;
-                BuildSortStr(info, null);
-            }
-            _chat_level = _chat_level - (info.Level);
-            if (!String.IsNullOrEmpty(old_father_str))
-            {
-                var suns = await dbSet.Where(x => x.Id != info.Id && x.FatherStr.StartsWith(old_father_str)).ToListAsync();
-                if (suns != null && suns.Count > 0)
-                {
-                    foreach (var item in suns)
-                    {
-                        item.FatherStr = item.FatherStr.Replace(old_father_str, info.FatherStr);
-                        item.Level = item.Level + _chat_level;
-                        item.RootId = info.RootId;
-                        BuildFootSortStr(item, info);
-                    }
-                }
-            }
-        }
+//            if (info.FatherId != 0)
+//            {
+//                var father = await dbSet.Where(x => x.Id == info.FatherId).AsNoTracking().FirstOrDefaultAsync();
+//                if (father != null && father != default)
+//                {
+//                    info.Level = father.Level + 1;
+//                    info.FatherStr = $"{father.FatherStr}{info.Id},";
+//                    info.RootId = father.RootId;
+//                    BuildSortStr(info, father);
+//                }
+//                else
+//                {
+//                    info.FatherId = 0;
+//                    info.FatherStr = $"{info.Id},";
+//                    info.Level = 0;
+//                    info.RootId = info.Id;
+//                    BuildSortStr(info, null);
+//                }
+//            }
+//            else
+//            {
+//                info.FatherId = 0;
+//                info.FatherStr = $"{info.Id},";
+//                info.Level = 0;
+//                info.RootId = info.Id;
+//                BuildSortStr(info, null);
+//            }
+//            _chat_level = _chat_level - (info.Level);
+//            if (!String.IsNullOrEmpty(old_father_str))
+//            {
+//                var suns = await dbSet.Where(x => x.Id != info.Id && x.FatherStr.StartsWith(old_father_str)).ToListAsync();
+//                if (suns != null && suns.Count > 0)
+//                {
+//                    foreach (var item in suns)
+//                    {
+//                        item.FatherStr = item.FatherStr.Replace(old_father_str, info.FatherStr);
+//                        item.Level = item.Level + _chat_level;
+//                        item.RootId = info.RootId;
+//                        BuildFootSortStr(item, info);
+//                    }
+//                }
+//            }
+//        }
 
-        /// <summary>
-        /// 自动排序 基于同层级排序到后面,只有当当前是0的时候生效
-        /// </summary>
-        /// <param name="_dbContext"></param>
-        /// <param name="TableName">应该是PropertyName</param>
-        /// <param name="input"></param>
-        /// <param name="step"></param>
-        /// <returns></returns>
-        public static async Task AutoSort(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity input, int step = 10)
-        {
-            if (input.Sort == 0)
-            {
-                var dbType = _dbContext.GetType();
-                var dbProperty = dbType.GetProperty(TableName);
-                if (dbProperty != null)
-                {
-                    var dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
-                    if (dbSet != null)
-                    {
+//        /// <summary>
+//        /// 自动排序 基于同层级排序到后面,只有当当前是0的时候生效
+//        /// </summary>
+//        /// <param name="_dbContext"></param>
+//        /// <param name="TableName">应该是PropertyName</param>
+//        /// <param name="input"></param>
+//        /// <param name="step"></param>
+//        /// <returns></returns>
+//        public static async Task AutoSort(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity input, int step = 10)
+//        {
+//            if (input.Sort == 0)
+//            {
+//                var dbType = _dbContext.GetType();
+//                var dbProperty = dbType.GetProperty(TableName);
+//                if (dbProperty != null)
+//                {
+//                    var dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
+//                    if (dbSet != null)
+//                    {
 
-                        var _max = await dbSet.Where(x => x.FatherId == input.FatherId)
-                            .OrderByDescending(x => x.Sort)
-                            .Select(x => x.Sort)
-                            .FirstOrDefaultAsync();
-                        input.Sort = _max + 10;
-                    }
-                }
-            }
-        }
+//                        var _max = await dbSet.Where(x => x.FatherId == input.FatherId)
+//                            .OrderByDescending(x => x.Sort)
+//                            .Select(x => x.Sort)
+//                            .FirstOrDefaultAsync();
+//                        input.Sort = _max + 10;
+//                    }
+//                }
+//            }
+//        }
 
-        /// <summary>
-        /// 每层最大支持的排序位数 5表示00000
-        /// </summary>
-        private const int _persize = 5;
-        /// <summary>
-        /// 最大层级个数,从0开始 比如4就是 0 1 2 3
-        /// </summary>
-        private const int _maxlevel = 4;
+//        /// <summary>
+//        /// 每层最大支持的排序位数 5表示00000
+//        /// </summary>
+//        private const int _persize = 5;
+//        /// <summary>
+//        /// 最大层级个数,从0开始 比如4就是 0 1 2 3
+//        /// </summary>
+//        private const int _maxlevel = 4;
 
-        /// <summary>
-        /// 基于父级和当前自己的排序信息,构建对应的排序字符串
-        /// </summary>
-        /// <param name="_info"></param>
-        /// <param name="_father"></param>
-        private static void BuildSortStr(ILevelEntity _info, ILevelEntity _father)
-        {
-            if (_info.Level < _maxlevel)
-            {
-                if (_father == null)
-                {
-                    _info.SortStr = _info.Sort.ToString().PadLeft(_persize, '0') + "0".PadLeft(_persize * (_maxlevel - 1), '0');
-                }
-                else
-                {
-                    if (!string.IsNullOrEmpty(_father.SortStr))
-                    {
-                        _info.SortStr = _father.SortStr.Substring(0, (_father.Level + 1) * _persize) + _info.Sort.ToString().PadLeft(_persize, '0');
-                        //补充尾巴
-                        if (_info.Level < (_maxlevel - 1))
-                        {
-                            _info.SortStr += "0".PadLeft(_persize * (_maxlevel - 1 - _info.Level), '0');
-                        }
-                    }
-                }
-            }
-        }
+//        /// <summary>
+//        /// 基于父级和当前自己的排序信息,构建对应的排序字符串
+//        /// </summary>
+//        /// <param name="_info"></param>
+//        /// <param name="_father"></param>
+//        private static void BuildSortStr(ILevelEntity _info, ILevelEntity _father)
+//        {
+//            if (_info.Level < _maxlevel)
+//            {
+//                if (_father == null)
+//                {
+//                    _info.SortStr = _info.Sort.ToString().PadLeft(_persize, '0') + "0".PadLeft(_persize * (_maxlevel - 1), '0');
+//                }
+//                else
+//                {
+//                    if (!string.IsNullOrEmpty(_father.SortStr))
+//                    {
+//                        _info.SortStr = _father.SortStr.Substring(0, (_father.Level + 1) * _persize) + _info.Sort.ToString().PadLeft(_persize, '0');
+//                        //补充尾巴
+//                        if (_info.Level < (_maxlevel - 1))
+//                        {
+//                            _info.SortStr += "0".PadLeft(_persize * (_maxlevel - 1 - _info.Level), '0');
+//                        }
+//                    }
+//                }
+//            }
+//        }
 
-        /// <summary>
-        /// 上级或者祖籍变更的替换,自己之后的不变,中间层级也不变 
-        /// </summary>
-        /// <param name="_info"></param>
-        /// <param name="_father">是自己的上级或者祖级</param>
-        private static void BuildFootSortStr(ILevelEntity _info, ILevelEntity _father)
-        {
-            var _old_sort_str = _info.SortStr;
-            _info.SortStr = _father.SortStr.Substring(0, (_father.Level + 1) * _persize);
-            _info.SortStr += _old_sort_str.Substring((_father.Level + 1) * _persize);
-        }
+//        /// <summary>
+//        /// 上级或者祖籍变更的替换,自己之后的不变,中间层级也不变 
+//        /// </summary>
+//        /// <param name="_info"></param>
+//        /// <param name="_father">是自己的上级或者祖级</param>
+//        private static void BuildFootSortStr(ILevelEntity _info, ILevelEntity _father)
+//        {
+//            var _old_sort_str = _info.SortStr;
+//            _info.SortStr = _father.SortStr.Substring(0, (_father.Level + 1) * _persize);
+//            _info.SortStr += _old_sort_str.Substring((_father.Level + 1) * _persize);
+//        }
 
-    }
-}
+//    }
+//}
example/ExampleApeart.Handler/modelhandler/RoleBackLoadHandler.cs
diff --git a/example/ExampleApeart.Handler/modelhandler/UserHandler.cs b/example/ExampleApeart.Handler/modelhandler/RoleBackLoadHandler.cs
similarity index 95%
rename from example/ExampleApeart.Handler/modelhandler/UserHandler.cs
rename to example/ExampleApeart.Handler/modelhandler/RoleBackLoadHandler.cs
index 5df9c16..17b0709 100644
--- a/example/ExampleApeart.Handler/modelhandler/UserHandler.cs
+++ b/example/ExampleApeart.Handler/modelhandler/RoleBackLoadHandler.cs
@@ -8,7 +8,7 @@ using System.Text.Json;
 
 namespace ExampleApeart.Handler
 {
-    public class UserHandler
+    public class RoleBackLoadHandler
     {
 
 
@@ -121,7 +121,7 @@ namespace ExampleApeart.Handler
                         await _dbContext.RoleInfo.Where(x => true).ExecuteDeleteAsync();
                         foreach (var item in list)
                         {
-                            await IncludeInsert(_dbContext, item);
+                            await IncludeInsertAsync(_dbContext, item);
                         }
                         if (tran)
                         {
@@ -154,22 +154,23 @@ namespace ExampleApeart.Handler
         /// </summary>
         /// <param name="item"></param>
         /// <returns></returns>
-        private static async Task IncludeInsert(IExampleApeartDbContext _dbContext, RoleInfoAddDto item)
+        private static async Task IncludeInsertAsync(IExampleApeartDbContext _dbContext, RoleInfoAddDto item)
         {
-            var _add = await LevelHandler.RoleAdd(_dbContext, item);
+            //var _add = await LevelHandler.RoleAdd(_dbContext, item);
+            var _add = item.Adapt<RoleInfo>();
+            _dbContext.Add(_add);
+            await _dbContext.SaveChangesAsync();
             if (item.Items != null)
             {
                 foreach (var ii in item.Items)
                 {
                     ii.FatherId = _add.Id;
                     //var _new = await _userHandler.RoleAdd(_dbContext,ii);
-                    await IncludeInsert(_dbContext, ii);
+                    await IncludeInsertAsync(_dbContext, ii);
                 }
             }
         }
 
-
-
     }
 
 }
example/ExampleApeart.HttpApi.Host/Controllers/TestController.cs
diff --git a/example/ExampleApeart.HttpApi.Host/Controllers/TestController.cs b/example/ExampleApeart.HttpApi.Host/Controllers/TestController.cs
index a56472c..6502ce0 100644
--- a/example/ExampleApeart.HttpApi.Host/Controllers/TestController.cs
+++ b/example/ExampleApeart.HttpApi.Host/Controllers/TestController.cs
@@ -90,7 +90,7 @@ namespace ExampleApeart.HttpApi.Host.Controllers
             var newone = new UserInfo { };
             first.Adapt(newone);
             //注意ID会带出来.... ... 
-            return $"Id{newone.Id} UserName{newone.UserName}";
+            return $"Id{newone.Id} UserName{newone.Name}";
         }
 
 
example/ExampleApeart.HttpApi.Host/Controllers/UserController.cs
diff --git a/example/ExampleApeart.HttpApi.Host/Controllers/UserController.cs b/example/ExampleApeart.HttpApi.Host/Controllers/UserController.cs
index 35ff649..d58a914 100644
--- a/example/ExampleApeart.HttpApi.Host/Controllers/UserController.cs
+++ b/example/ExampleApeart.HttpApi.Host/Controllers/UserController.cs
@@ -159,7 +159,7 @@ namespace ExampleApeart.HttpApi.Host.Controllers
                 base.Response.Cookies.Append(PublicString.TokenHeadName, token, new Microsoft.AspNetCore.Http.CookieOptions() { Path = "/", Expires = DateTimeOffset.Now.AddSeconds(PublicString.TokenTimeOut), Secure = false });
                 return new
                 {
-                    name = user.UserName,
+                    name = user.Name,
                     token = token
                 };
             }
example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.Contracts.xml
diff --git a/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.Contracts.xml b/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.Contracts.xml
index e1ffac7..2c69a21 100644
--- a/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.Contracts.xml
+++ b/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.Contracts.xml
@@ -4,6 +4,36 @@
         <name>ExampleApeart.Application.Contracts</name>
     </assembly>
     <members>
+        <member name="T:ExampleApeart.Application.Contracts.eventmodels.EventAfterGradeCreateModel">
+            <summary>
+            角色创建后 案例事件,角色创建后
+            </summary>
+        </member>
+        <member name="P:ExampleApeart.Application.Contracts.eventmodels.EventAfterGradeCreateModel.GradeId">
+            <summary>
+            角色
+            </summary>
+        </member>
+        <member name="P:ExampleApeart.Application.Contracts.eventmodels.EventAfterGradeCreateModel.CreateUserId">
+            <summary>
+            创建者
+            </summary>
+        </member>
+        <member name="T:ExampleApeart.Application.Contracts.eventmodels.EventAfterUserCreateModel">
+            <summary>
+            用户创建后 案例,用户创建后
+            </summary>
+        </member>
+        <member name="P:ExampleApeart.Application.Contracts.eventmodels.EventAfterUserCreateModel.UserId">
+            <summary>
+            账号
+            </summary>
+        </member>
+        <member name="P:ExampleApeart.Application.Contracts.eventmodels.EventAfterUserCreateModel.CreateUserId">
+            <summary>
+            创建者
+            </summary>
+        </member>
         <member name="T:ExampleApeart.Application.Contracts.eventmodels.EventDemoModel">
             <summary>
             案例
@@ -359,11 +389,6 @@
             排序串
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.RoleInfoDto.RootId">
-            <summary>
-            根级
-            </summary>
-        </member>
         <member name="P:ExampleApeart.usermodels.RoleInfoDto.FatherStr">
             <summary>
             父级串
@@ -719,7 +744,7 @@
             密码
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfoAddDto.UserName">
+        <member name="P:ExampleApeart.usermodels.UserInfoAddDto.Name">
             <summary>
             用户名
             </summary>
@@ -729,7 +754,7 @@
             描述
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfoAddDto.UserHead">
+        <member name="P:ExampleApeart.usermodels.UserInfoAddDto.Head">
             <summary>
             头像
             </summary>
@@ -769,11 +794,6 @@
             角色 测试用的
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfoUpdateDto.Grades">
-            <summary>
-            扩展 包含的角色列表
-            </summary>
-        </member>
         <member name="T:ExampleApeart.usermodels.UserInfoDto">
             <summary>
             用户信息
@@ -789,12 +809,12 @@
             用户信息
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfoListDto.UserName">
+        <member name="P:ExampleApeart.usermodels.UserInfoListDto.Name">
             <summary>
             用户名
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfoListDto.UserHead">
+        <member name="P:ExampleApeart.usermodels.UserInfoListDto.Head">
             <summary>
             头像
             </summary>
@@ -839,12 +859,7 @@
             用户名
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserShort.UserName">
-            <summary>
-            用户名
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.usermodels.UserShort.UserHead">
+        <member name="P:ExampleApeart.usermodels.UserShort.Head">
             <summary>
             头像
             </summary>
@@ -859,12 +874,12 @@
             
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserShortModel.UserName">
+        <member name="P:ExampleApeart.usermodels.UserShortModel.Name">
             <summary>
             用户名
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserShortModel.UserHead">
+        <member name="P:ExampleApeart.usermodels.UserShortModel.Head">
             <summary>
             头像
             </summary>
example/ExampleApeart.HttpApi.Host/ExampleApeart.Domain.xml
diff --git a/example/ExampleApeart.HttpApi.Host/ExampleApeart.Domain.xml b/example/ExampleApeart.HttpApi.Host/ExampleApeart.Domain.xml
index 9b4ea70..f7af271 100644
--- a/example/ExampleApeart.HttpApi.Host/ExampleApeart.Domain.xml
+++ b/example/ExampleApeart.HttpApi.Host/ExampleApeart.Domain.xml
@@ -114,46 +114,6 @@
             小程序菜单
             </summary>
         </member>
-        <member name="T:ExampleApeart.ILevelEntity">
-            <summary>
-            支持 非递归多级查询,支持多级排序
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.Id">
-            <summary>
-            标识
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.SortStr">
-            <summary>
-            排序串
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.Level">
-            <summary>
-            层级
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.Sort">
-            <summary>
-            排序 层级内排序
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.FatherId">
-            <summary>
-            父级
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.FatherStr">
-            <summary>
-            父级串 替换递归查询用
-            </summary>
-        </member>
-        <member name="P:ExampleApeart.ILevelEntity.RootId">
-            <summary>
-            根级 大块
-            </summary>
-        </member>
         <member name="T:ExampleApeart.ExampleApeartDbProperties">
             <summary>
             
@@ -226,7 +186,7 @@
         </member>
         <member name="T:ExampleApeart.usermodels.GradeRole">
             <summary>
-            角色绑定权限
+            角色权限
             </summary>
         </member>
         <member name="P:ExampleApeart.usermodels.GradeRole.GradeId">
@@ -284,6 +244,11 @@
             权限类型 0权限1菜单2按钮
             </summary>
         </member>
+        <member name="P:ExampleApeart.usermodels.RoleInfo.IsDefault">
+            <summary>
+            默认权限 是否是默认权限
+            </summary>
+        </member>
         <member name="P:ExampleApeart.usermodels.RoleInfo.IsEnable">
             <summary>
             状态
@@ -309,11 +274,6 @@
             
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.RoleInfo.RootId">
-            <summary>
-            
-            </summary>
-        </member>
         <member name="P:ExampleApeart.usermodels.RoleInfo.FatherStr">
             <summary>
             
@@ -339,12 +299,12 @@
             用户信息
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfo.UserName">
+        <member name="P:ExampleApeart.usermodels.UserInfo.Name">
             <summary>
             用户名
             </summary>
         </member>
-        <member name="P:ExampleApeart.usermodels.UserInfo.UserHead">
+        <member name="P:ExampleApeart.usermodels.UserInfo.Head">
             <summary>
             头像
             </summary>
example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
diff --git a/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml b/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
index 5198316..7c70fd4 100644
--- a/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
+++ b/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
@@ -433,6 +433,12 @@
             <param name="args"></param>
             <returns></returns>
         </member>
+        <member name="M:ExampleApeart.Program.ConfigureAutofac(Autofac.ContainerBuilder)">
+            <summary>
+            配置autofac
+            </summary>
+            <param name="containerBuilder"></param>
+        </member>
         <member name="T:ExampleApeart.StartHostedService">
             <summary>
             系统初始化
example/ExampleApeart.HttpApi.Host/Program.cs
diff --git a/example/ExampleApeart.HttpApi.Host/Program.cs b/example/ExampleApeart.HttpApi.Host/Program.cs
index 0357adf..ed9a87a 100644
--- a/example/ExampleApeart.HttpApi.Host/Program.cs
+++ b/example/ExampleApeart.HttpApi.Host/Program.cs
@@ -97,13 +97,33 @@ namespace ExampleApeart
             }
         }
 
+        /// <summary>
+        /// 配置autofac
+        /// </summary>
+        /// <param name="containerBuilder"></param>
         private static void ConfigureAutofac(ContainerBuilder containerBuilder)
         {
-            // 获取程序集
-            var applicationAssembly = typeof(ExampleApeartApplicationModule).Assembly;
 
+            /*
+                var host = Host.CreateDefaultBuilder(args)
+                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
+                .ConfigureContainer<ContainerBuilder>(containerBuilder =>
+                {
+                // Autofac 配置
+                ConfigureAutofac(containerBuilder);
+                })
+                .ConfigureWebHostDefaults(webBuilder =>
+                {
+                webBuilder.UseConfiguration(Configuration);
+                webBuilder.UseStartup<Startup>();
+                })
+                .UseSerilog()
+                .Build();
+             */
+
+            // 获取程序集
             // 1. 注册所有 AppService(启用属性注入)
-            containerBuilder.RegisterAssemblyTypes(applicationAssembly)
+            containerBuilder.RegisterAssemblyTypes(typeof(ExampleApeartApplicationModule).Assembly)
                 .Where(t => t.IsClass && !t.IsAbstract && typeof(IAppService).IsAssignableFrom(t))
                 .AsSelf()
                 .AsImplementedInterfaces()
@@ -141,7 +161,6 @@ namespace ExampleApeart
 
         internal static IHostBuilder CreateHostBuilder(string[] args) =>
             Host.CreateDefaultBuilder(args)
-
                 .ConfigureWebHostDefaults(webBuilder =>
                 {
                     webBuilder.UseConfiguration(Configuration);
example/ExampleApeart.HttpApi.Host/Services/StartHostedService.cs
diff --git a/example/ExampleApeart.HttpApi.Host/Services/StartHostedService.cs b/example/ExampleApeart.HttpApi.Host/Services/StartHostedService.cs
index e59efb1..33a64a5 100644
--- a/example/ExampleApeart.HttpApi.Host/Services/StartHostedService.cs
+++ b/example/ExampleApeart.HttpApi.Host/Services/StartHostedService.cs
@@ -128,7 +128,7 @@ namespace ExampleApeart
                         await _dbContext.Database.BeginTransactionAsync();
                         var one = new UserInfo();
                         one.Email = config.RootAccount;
-                        one.UserName = "管理员";
+                        one.Name = "管理员";
                         one.CreateDate = DateTime.Now;
                         //one.Grade = "admin";
                         one.IsEnable = true;
@@ -154,7 +154,7 @@ namespace ExampleApeart
                         _dbContext.Add(new UserGrade() { GradeId = groupid, UserId = adminid });
                         await _dbContext.SaveChangesAsync();
 
-                        await UserHandler.LoadAsync(_dbContext, false);
+                        await RoleBackLoadHandler.LoadAsync(_dbContext, false);
                         await _dbContext.Database.CommitTransactionAsync();
                     }
                     catch (Exception exlinit)
example/ExampleApeart.HttpApi.Host/config/roles.json
diff --git a/example/ExampleApeart.HttpApi.Host/config/roles.json b/example/ExampleApeart.HttpApi.Host/config/roles.json
index 81611a3..5232feb 100644
--- a/example/ExampleApeart.HttpApi.Host/config/roles.json
+++ b/example/ExampleApeart.HttpApi.Host/config/roles.json
@@ -114,6 +114,19 @@
         "sort": 900,
         "fatherId": 121,
         "items": null
+      },
+      {
+        "name": "事件控制台",
+        "model": "",
+        "role": "",
+        "icon": "Hui-iconfont-pifu",
+        "path": "./pasteform/index.html?path=quickHandler",
+        "roleType": 1,
+        "desc": "",
+        "isEnable": true,
+        "sort": 800,
+        "fatherId": 121,
+        "items": null
       }
     ]
   }
framework/PasteApeart.Handler/lazy/ILazyServiceProvider.cs
diff --git a/framework/PasteApeart.Handler/lazy/ILazyServiceProvider.cs b/framework/PasteApeart.Handler/lazy/ILazyServiceProvider.cs
index 5fa0a65..37814c3 100644
--- a/framework/PasteApeart.Handler/lazy/ILazyServiceProvider.cs
+++ b/framework/PasteApeart.Handler/lazy/ILazyServiceProvider.cs
@@ -1,17 +1,37 @@
 namespace PasteApeart.Handler.lazy
 {
-
     /// <summary>
-    /// 懒加载 需要使用AUTOFAC
+    /// 
     /// </summary>
     public interface ILazyServiceProvider
     {
         /// <summary>
         /// 
         /// </summary>
+        /// <param name="serviceType"></param>
+        /// <returns></returns>
+        object GetRequiredService(Type serviceType);
+
+        /// <summary>
+        /// 
+        /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <returns></returns>
-        T LazyGetRequiredService<T>() where T : class;
+        T GetRequiredService<T>() where T : class;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="serviceType"></param>
+        /// <returns></returns>
+        object GetService(Type serviceType);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        T GetService<T>() where T : class;
 
         /// <summary>
         /// 
@@ -19,6 +39,35 @@ namespace PasteApeart.Handler.lazy
         /// <param name="serviceType"></param>
         /// <returns></returns>
         object LazyGetRequiredService(Type serviceType);
-    }
 
-}
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        T LazyGetRequiredService<T>() where T : class;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="factory"></param>
+        /// <returns></returns>
+        T LazyGetRequiredService<T>(Func<IServiceProvider, object> factory) where T : class;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        T LazyGetService<T>() where T : class;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="factory"></param>
+        /// <returns></returns>
+        T LazyGetService<T>(Func<IServiceProvider, object> factory) where T : class;
+    }
+}
\ No newline at end of file
framework/PasteApeart.Handler/lazy/LazyServiceProvider.cs
diff --git a/framework/PasteApeart.Handler/lazy/LazyServiceProvider.cs b/framework/PasteApeart.Handler/lazy/LazyServiceProvider.cs
index 8efbd60..9b35254 100644
--- a/framework/PasteApeart.Handler/lazy/LazyServiceProvider.cs
+++ b/framework/PasteApeart.Handler/lazy/LazyServiceProvider.cs
@@ -88,6 +88,47 @@ namespace PasteApeart.Handler.lazy
                 new Lazy<object>(() => _componentContext.Resolve(serviceType)))
                 .Value;
         }
+
+        /// <summary>
+        /// 立即解析并返回指定类型的服务,找不到时抛出异常
+        /// </summary>
+        /// <typeparam name="T">服务类型</typeparam>
+        /// <returns>服务实例</returns>
+        public T GetRequiredService<T>() where T : class
+        {
+            return _componentContext.Resolve<T>();
+        }
+
+        /// <summary>
+        /// 立即解析并返回指定类型的服务,找不到时抛出异常
+        /// </summary>
+        /// <param name="serviceType">服务类型</param>
+        /// <returns>服务实例</returns>
+        public object GetRequiredService(Type serviceType)
+        {
+            return _componentContext.Resolve(serviceType);
+        }
+
+        /// <summary>
+        /// 立即解析并返回指定类型的服务,找不到时返回 null
+        /// </summary>
+        /// <typeparam name="T">服务类型</typeparam>
+        /// <returns>服务实例或 null</returns>
+        public T GetService<T>() where T : class
+        {
+            return _componentContext.ResolveOptional<T>();
+        }
+
+        /// <summary>
+        /// 立即解析并返回指定类型的服务,找不到时返回 null
+        /// </summary>
+        /// <param name="serviceType">服务类型</param>
+        /// <returns>服务实例或 null</returns>
+        public object GetService(Type serviceType)
+        {
+            return _componentContext.ResolveOptional(serviceType);
+        }
+
     }
 
 
framework/PasteApeart.Handler/lazy/readme.md
diff --git a/framework/PasteApeart.Handler/lazy/readme.md b/framework/PasteApeart.Handler/lazy/readme.md
new file mode 100644
index 0000000..61772e3
--- /dev/null
+++ b/framework/PasteApeart.Handler/lazy/readme.md
@@ -0,0 +1,69 @@
+
+## 使用案例代码
+
+
+```csharp
+
+        /// <summary>
+        /// 配置autofac
+        /// </summary>
+        /// <param name="containerBuilder"></param>
+        private static void ConfigureAutofac(ContainerBuilder containerBuilder)
+        {
+
+            /*
+                var host = Host.CreateDefaultBuilder(args)
+                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
+                .ConfigureContainer<ContainerBuilder>(containerBuilder =>
+                {
+                // Autofac 配置
+                ConfigureAutofac(containerBuilder);
+                })
+                .ConfigureWebHostDefaults(webBuilder =>
+                {
+                webBuilder.UseConfiguration(Configuration);
+                webBuilder.UseStartup<Startup>();
+                })
+                .UseSerilog()
+                .Build();
+             */
+
+            // 获取程序集
+            // 1. 注册所有 AppService(启用属性注入)
+            containerBuilder.RegisterAssemblyTypes(typeof(ExampleApeartApplicationModule).Assembly)
+                .Where(t => t.IsClass && !t.IsAbstract && typeof(IAppService).IsAssignableFrom(t))
+                .AsSelf()
+                .AsImplementedInterfaces()
+                .InstancePerLifetimeScope()
+                .PropertiesAutowired();  // 关键:启用属性注入
+
+            // 2. 注册 LazyServiceProvider
+            containerBuilder.RegisterType<LazyServiceProvider>()
+                .InstancePerLifetimeScope()
+                .PropertiesAutowired();
+
+            //// 关键:将所有接口都指向 SqliteDbContext 可以在这里注入,也可以在EF那边那样注入
+            //builder.RegisterType<SqliteDbContext>()
+            //    .As<IApBaseDb>()
+            //    .As<IApeartDbContext>()
+            //    .As<ApBaseDb<SqliteDbContext>>()
+            //    .As<ApeartDbContext<SqliteDbContext>>()
+            //    .InstancePerLifetimeScope();
+
+            // 3. 注册 Startup 所在程序集的所有 Controller
+            var hostAssembly = typeof(Startup).Assembly;
+            containerBuilder.RegisterAssemblyTypes(hostAssembly)
+                .Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith("Controller"))
+                .InstancePerLifetimeScope()
+                .PropertiesAutowired();
+
+            // 4. 如果有其他程序集需要注册,继续添加
+            // var domainAssembly = typeof(ExampleApeartDomainModule).Assembly;
+            // containerBuilder.RegisterAssemblyTypes(domainAssembly)
+            //     .Where(t => t.IsClass && !t.IsAbstract)
+            //     .AsImplementedInterfaces()
+            //     .InstancePerLifetimeScope()
+            //     .PropertiesAutowired();
+        }
+
+```
\ No newline at end of file
​ ​