public void Create(MenuDTO menu)
        {
            IUnitOfWork unitOfWork;

            using (unitOfWork = _unitOfWorkManager.Begin())
            {
                var repo = unitOfWork.GetRepository <MenuDTO, int>();
                repo.Add(menu);

                unitOfWork.Commit();
            }
        }
        /// <summary>
        /// 从 Controller/Action 中生成菜单数据
        /// </summary>
        /// <param name="isSync">是否同步。True 表示同步,即删除原先的菜单数据重新生成。默认为 False,如果菜单数据已经存在,则直接返回。</param>
        /// <returns></returns>
        public List <MenuDTO> GenerateMenusByControllerAction(bool isSync = false)
        {
            //TODO, lock may affect the performance
            lock (_lockObj)
            {
                IUnitOfWork unitOfWork;
                using (unitOfWork = _unitOfWorkManager.Begin())
                {
                    var menuRepo = unitOfWork.GetRepository <MenuDTO, int>();

                    List <MenuDTO> menus;

                    if (!isSync)
                    {
                        menus = menuRepo.GetAll().ToList();
                        if (menus != null && menus.Any())
                        {
                            return(menus);
                        }
                    }

                    //如果同步,则删除原先的数据重新生成。
                    menuRepo.RemoveAll();

                    Assembly assembly = Assembly.GetEntryAssembly();

                    menus = new List <MenuDTO>();
                    Regex regexClaimPolicy     = new Regex(ClaimConstants.CLAIM_REGULAR_PATTERN);
                    var   controlleractionlist = ClaimsAnalyzer.GetControllerActionList(assembly);

                    controlleractionlist.ForEach(action =>
                    {
                        //获得 action 级别的 attribute
                        IEnumerable <AuthorizeAttribute> controllerLevelAuthorizeAttrs = action.DeclaringType.GetCustomAttributes <AuthorizeAttribute>(true);
                        IEnumerable <AuthorizeAttribute> actionLevelAuthorizeAttrs     = action.GetCustomAttributes <AuthorizeAttribute>(true);

                        //bool accessAllowed = true;
                        List <Claim> claims = GetClaimsFromAuthorizeAttribute(controllerLevelAuthorizeAttrs, regexClaimPolicy);
                        claims.AddRange(GetClaimsFromAuthorizeAttribute(actionLevelAuthorizeAttrs, regexClaimPolicy));


                        string controllerName = GetControllerName(action.DeclaringType);
                        MenuDTO menu          = new MenuDTO
                        {
                            Name    = controllerName + action.Name,
                            Url     = _url.Action(action.Name, controllerName),
                            Order   = 0,
                            Claims  = String.Join(GeneralConstants.DelimeterSemicolon, claims ?? new List <Claim>()),
                            Visible = true
                        };

                        menus.Add(menu);
                        menuRepo.AddRange(menus);
                    });

                    unitOfWork.Commit();

                    return(menus);
                }
            }
        }