using AutoMapper; using DMS.Core.Interfaces; using DMS.Core.Models; using DMS.Application.Interfaces.Database; using DMS.Application.Interfaces; namespace DMS.Application.Services.Database; /// /// 菜单应用服务,负责处理菜单相关的业务逻辑。 /// 实现 接口。 /// public class MenuAppService : IMenuAppService { private readonly IRepositoryManager _repoManager; private readonly IMapper _mapper; /// /// 构造函数,通过依赖注入获取仓储管理器和AutoMapper实例。 /// /// 仓储管理器实例。 /// AutoMapper 实例。 public MenuAppService(IRepositoryManager repoManager, IMapper mapper) { _repoManager = repoManager; _mapper = mapper; } /// /// 异步根据ID获取菜单。 /// /// 菜单ID。 /// 菜单对象。 public async Task GetMenuByIdAsync(int id) { var menu = await _repoManager.Menus.GetByIdAsync(id); return _mapper.Map(menu); } /// /// 异步获取所有菜单列表。 /// /// 菜单列表。 public async Task> GetAllMenusAsync() { var menus = await _repoManager.Menus.GetAllAsync(); return _mapper.Map>(menus); } /// /// 异步创建一个新菜单(事务性操作)。 /// /// 要创建的菜单。 /// 新创建菜单的ID。 /// 如果创建菜单时发生错误。 public async Task CreateMenuAsync(MenuBean menu) { try { await _repoManager.BeginTranAsync(); await _repoManager.Menus.AddAsync(menu); await _repoManager.CommitAsync(); return menu.Id; } catch (Exception ex) { await _repoManager.RollbackAsync(); throw new ApplicationException("创建菜单时发生错误,操作已回滚。", ex); } } /// /// 异步更新一个已存在的菜单(事务性操作)。 /// /// 要更新的菜单。 /// 受影响的行数。 /// 如果找不到菜单或更新菜单时发生错误。 public async Task UpdateMenuAsync(MenuBean menu) { try { await _repoManager.BeginTranAsync(); var dbmenu = await _repoManager.Menus.GetByIdAsync(menu.Id); if (dbmenu == null) { throw new ApplicationException($"Menu with ID {menu.Id} not found."); } _mapper.Map(menu, dbmenu); int res = await _repoManager.Menus.UpdateAsync(dbmenu); await _repoManager.CommitAsync(); return res; } catch (Exception ex) { await _repoManager.RollbackAsync(); throw new ApplicationException("更新菜单时发生错误,操作已回滚。", ex); } } /// /// 异步删除一个菜单(事务性操作)。 /// /// 要删除菜单的ID。 /// 如果删除成功则为 true,否则为 false。 /// 如果删除菜单失败。 /// 如果删除菜单时发生其他错误。 public async Task DeleteMenuAsync(int id) { try { await _repoManager.BeginTranAsync(); var delRes = await _repoManager.Menus.DeleteByIdAsync(id); if (delRes == 0) { throw new InvalidOperationException($"删除菜单失败:菜单ID:{id},请检查菜单Id是否存在"); } await _repoManager.CommitAsync(); return true; } catch (Exception ex) { await _repoManager.RollbackAsync(); throw new ApplicationException("删除菜单时发生错误,操作已回滚。", ex); } } }