ABP框架服务层的接口与实现(增删改查)
Posted 海阔天空XM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABP框架服务层的接口与实现(增删改查)相关的知识,希望对你有一定的参考价值。
public interface ITaskAppService : IApplicationService { IList<TaskDto> GetAllTasks();//所有 GetTasksOutput GetTasks(GetTasksInput input);//根据查询参数 获取结果列表 PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input);//根据查询参数,返回被分页的结果列表 TaskDto GetTaskById(int taskId); TaskCacheItem GetTaskFromCacheById(int taskId); Task<TaskDto> GetTaskByIdAsync(int taskId); void UpdateTask(UpdateTaskInput input); int CreateTask(CreateTaskInput input); void DeleteTask(int taskId); }
public IList<TaskDto> GetAllTasks() { var tasks = _taskRepository.GetAll().OrderByDescending(t => t.CreationTime).ToList(); return Mapper.Map<IList<TaskDto>>(tasks);//因为已经定义了映射转换规则 } //多条件查询 public GetTasksOutput GetTasks(GetTasksInput input) { var query = _taskRepository.GetAll().Include(t => t.AssignedPerson) .WhereIf(input.State.HasValue, t => t.State == input.State.Value) .WhereIf(!input.Filter.IsNullOrEmpty(), t => t.Title.Contains(input.Filter)) .WhereIf(input.AssignedPersonId.HasValue, t => t.AssignedPersonId == input.AssignedPersonId.Value); //WhereIf为Linq扩展方法,表示如果第一个表达式为true,则加第二个过滤条件 //排序 if (!string.IsNullOrEmpty(input.Sorting))//排序字段是否有值 query = query.OrderBy(input.Sorting); else query = query.OrderByDescending(t => t.CreationTime); var taskList = query.ToList(); //Used AutoMapper to automatically convert List<Task> to List<TaskDto>. var tr = Mapper.Map<List<TaskDto>>(taskList); return new GetTasksOutput { Tasks = tr }; //return new GetTasksOutput //{ // Tasks = Mapper.Map<List<TaskDto>>(taskList) //}; } public PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input) { //初步过滤 var query = _taskRepository.GetAll().Include(t => t.AssignedPerson) .WhereIf(input.State.HasValue, t => t.State == input.State.Value) .WhereIf(!input.Filter.IsNullOrEmpty(), t => t.Title.Contains(input.Filter)) .WhereIf(input.AssignedPersonId.HasValue, t => t.AssignedPersonId == input.AssignedPersonId.Value); //排序 query = !string.IsNullOrEmpty(input.Sorting) ? query.OrderBy(input.Sorting) : query.OrderByDescending(t => t.CreationTime); //获取总数 var tasksCount = query.Count(); //默认的分页方式 //var taskList = query.Skip(input.SkipCount).Take(input.MaxResultCount).ToList(); //ABP提供了扩展方法PageBy分页方式 var taskList = query.PageBy(input).ToList(); return new PagedResultDto<TaskDto>(tasksCount, taskList.MapTo<List<TaskDto>>()); } public TaskDto GetTaskById(int taskId) { var task = _taskRepository.Get(taskId); return task.MapTo<TaskDto>(); } public TaskCacheItem GetTaskFromCacheById(int taskId) { return _taskCache[taskId]; } public async Task<TaskDto> GetTaskByIdAsync(int taskId) { //Called specific GetAllWithPeople method of task repository. var task = await _taskRepository.GetAsync(taskId); //Used AutoMapper to automatically convert List<Task> to List<TaskDto>. return task.MapTo<TaskDto>(); } public void UpdateTask(UpdateTaskInput input) { //We can use Logger, it\'s defined in ApplicationService base class. Logger.Info("Updating a task for input: " + input); //获取是否有权限 bool canAssignTaskToOther = PermissionChecker.IsGranted(PermissionNames.Pages_Tasks_AssignPerson); //如果任务已经分配且未分配给自己,且不具有分配任务权限,则抛出异常 if (input.AssignedPersonId.HasValue && input.AssignedPersonId.Value != AbpSession.GetUserId() && !canAssignTaskToOther) { throw new AbpAuthorizationException("没有分配任务给他人的权限!"); } var updateTask = Mapper.Map<Task>(input); _taskRepository.Update(updateTask); } public int CreateTask(CreateTaskInput input) { //We can use Logger, it\'s defined in ApplicationService class. Logger.Info("Creating a task for input: " + input); //判断用户是否有权限 if (input.AssignedPersonId.HasValue && input.AssignedPersonId.Value !=AbpSession.GetUserId()) PermissionChecker.Authorize(PermissionNames.Pages_Tasks_AssignPerson); var task = Mapper.Map<Task>(input); int result = _taskRepository.InsertAndGetId(task); //只有创建成功才发送邮件和通知 if (result > 0) { task.CreationTime = Clock.Now; if (input.AssignedPersonId.HasValue) { task.AssignedPerson = _userRepository.Load(input.AssignedPersonId.Value); var message = "You hava been assigned one task into your todo list."; //TODO:需要重新配置QQ邮箱密码 //SmtpEmailSender emailSender = new SmtpEmailSender(_smtpEmialSenderConfig); //emailSender.Send("ysjshengjie@qq.com", task.AssignedPerson.EmailAddress, "New Todo item", message); _notificationPublisher.Publish("NewTask", new MessageNotificationData(message), null, NotificationSeverity.Info, new[] { task.AssignedPerson.ToUserIdentifier() }); } } return result; } [AbpAuthorize(PermissionNames.Pages_Tasks_Delete)] public void DeleteTask(int taskId) { var task = _taskRepository.Get(taskId); if (task != null) _taskRepository.Delete(task); }
仓储层再领域层定义,在基础层实现
领域层的定义,源码位置:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Abp.Domain.Entities; using Abp.Domain.Uow; namespace Abp.Domain.Repositories { /// <summary> /// This interface is implemented by all repositories to ensure implementation of fixed methods. /// </summary> /// <typeparam name="TEntity">Main Entity type this repository works on</typeparam> /// <typeparam name="TPrimaryKey">Primary key type of the entity</typeparam> public interface IRepository<TEntity, TPrimaryKey> : IRepository where TEntity : class, IEntity<TPrimaryKey> { #region Select/Get/Query /// <summary> /// Used to get a IQueryable that is used to retrieve entities from entire table. /// </summary> /// <returns>IQueryable to be used to select entities from database</returns> IQueryable<TEntity> GetAll(); /// <summary> /// Used to get a IQueryable that is used to retrieve entities from entire table. /// One or more /// </summary> /// <param name="propertySelectors">A list of include expressions.</param> /// <returns>IQueryable to be used to select entities from database</returns> IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] propertySelectors); /// <summary> /// Used to get all entities. /// </summary> /// <returns>List of all entities</returns> List<TEntity> GetAllList(); /// <summary> /// Used to get all entities. /// </summary> /// <returns>List of all entities</returns> Task<List<TEntity>> GetAllListAsync(); /// <summary> /// Used to get all entities based on given <paramref name="predicate"/>. /// </summary> /// <param name="predicate">A condition to filter entities</param> /// <returns>List of all entities</returns> List<TEntity> GetAllList(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Used to get all entities based on given <paramref name="predicate"/>. /// </summary> /// <param name="predicate">A condition to filter entities</param> /// <returns>List of all entities</returns> Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Used to run a query over entire entities. /// <see cref="UnitOfWorkAttribute"/> attribute is not always necessary (as opposite to <see cref="GetAll"/>) /// if <paramref name="queryMethod"/> finishes IQueryable with ToList, FirstOrDefault etc.. /// </summary> /// <typeparam name="T">Type of return value of this method</typeparam> /// <param name="queryMethod">This method is used to query over entities</param> /// <returns>Query result</returns> T Query<T>(Func<IQueryable<TEntity>, T> queryMethod); /// <summary> /// Gets an entity with given primary key. /// </summary> /// <param name="id">Primary key of the entity to get</param> /// <returns>Entity</returns> TEntity Get(TPrimaryKey id); /// <summary> /// Gets an entity with given primary key. /// </summary> /// <param name="id">Primary key of the entity to get</param> /// <returns>Entity</returns> Task<TEntity> GetAsync(TPrimaryKey id); /// <summary> /// Gets exactly one entity with given predicate. /// Throws exception if no entity or more than one entity. /// </summary> /// <param name="predicate">Entity</param> TEntity Single(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Gets exactly one entity with given predicate. /// Throws exception if no entity or more than one entity. /// </summary> /// <param name="predicate">Entity</param> Task<TEntity> SingleAsync(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Gets an entity with given primary key or null if not found. /// </summary> /// <param name="id">Primary key of the entity to get</param> /// <returns>Entity or null</returns> TEntity FirstOrDefault(TPrimaryKey id); /// <summary> /// Gets an entity with given primary key or null if not found. /// </summary> /// <param name="id">Primary key of the entity to get</param> /// <returns>Entity or null</returns> Task<TEntity> FirstOrDefaultAsync(TPrimaryKey id); /// <summary> /// Gets an entity with given given predicate or null if not found. /// </summary> /// <param name="predicate">Predicate to filter entities</param> TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Gets an entity with given given predicate or null if not found. /// </summary> /// <param name="predicate">Predicate to filter entities</param> Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Creates an entity with given primary key without database access. /// </summary> /// <param name="id">Primary key of the entity to load</param> /// <returns>Entity</returns> TEntity Load(TPrimaryKey id); #endregion #region Insert /// <summary> /// Inserts a new entity. /// </summary> /// <param name="entity">Inserted entity</param> TEntity Insert(TEntity entity); /// <summary> /// Inserts a new entity. /// </summary> /// <param name="entity">Inserted entity</param> Task<TEntity> InsertAsync(TEntity entity); /// <summary> /// Inserts a new entity and gets it\'s Id. /// It may require to save current unit of work /// to be able to retrieve id. /// </summary> /// <param name="entity">Entity</param> /// <returns>Id of the entity</returns> TPrimaryKey InsertAndGetId(TEntity entity); /// <summary> /// Inserts a new entity and gets it\'s Id. /// It may require to save current unit of work /// to be able to retrieve id. /// </summary> /// <param name="entity">Entity</param> /// <returns>Id of the entity</returns> Task<TPrimaryKey> InsertAndGetIdAsync(TEntity entity); /// <summary> /// Inserts or updates given entity depending on Id\'s value. /// </summary> /// <param name="entity">Entity</param> TEntity InsertOrUpdate(TEntity entity); /// <summary> /// Inserts or updates given entity depending on Id\'s value. /// </summary> /// <param name="entity">Entity</param> Task<TEntity> InsertOrUpdateAsync(TEntity entity); /// <summary> /// Inserts or updates given entity depending on Id\'s value. /// Also returns Id of the entity. /// It may require to save current unit of work /// to be able to retrieve id. /// </summary> /// <param name="entity">Entity</param> /// <returns>Id of the entity</returns> TPrimaryKey InsertOrUpdateAndGetId(TEntity entity); /// <summary> /// Inserts or updates given entity depending on Id\'s value. /// Also returns Id of the entity. /// It may require to save current unit of work /// to be able to retrieve id. /// </summary> /// <param name="entity">Entity</param> /// <returns>Id of the entity</returns> Task<TPrimaryKey> InsertOrUpdateAndGetIdAsync(TEntity entity); #endregion #region Update /// <summary> /// Updates an existing entity. /// </summary> /// <param name="entity">Entity</param> TEntity Update(TEntity entity); /// <summary> /// Updates an existing entity. /// </summary> /// <param name="entity">Entity</param> Task<TEntity> UpdateAsync(TEntity entity); /// <summary> /// Updates an existing entity. /// </summary> /// <param name="id">Id of the entity</param> /// <param name="updateAction">Action that can be used to change values of the entity</param> /// <returns>Updated entity</returns> TEntity Update(TPrimaryKey id, Action<TEntity> updateAction); /// <summary> /// Updates an existing entity. /// </summary> /// <param name="id">Id of the entity</param> /// <param name="updateAction">Action that can be used to change values of the entity</param> /// <returns>Updated entity</returns> Task<TEntity> UpdateAsync(TPrimaryKey id, Func<TEntity, Task> updateAction); #endregion #region Delete /// <summary> /// Deletes an entity. /// </summary> /// <param name="entity">Entity to be deleted</param> void Delete(TEntity entity); /// <summary> /// Deletes an entity. /// </summary> /// <param name="entity">Entity to be deleted</param> Task DeleteAsync(TEntity entity); /// <summary> /// Deletes an entity by primary key. /// </summary> /// <param name="id">Primary key of the entity</param> void Delete(TPrimaryKey id); /// <summary> /// Deletes an entity by primary key. /// </summary> /// <param name="id">Primary key of the entity</param> Task DeleteAsync(TPrimaryKey id); /// <summary> /// Deletes many entities by function. /// Notice that: All entities fits to given predicate are retrieved and deleted. /// This may cause major performance problems if there are too many entities with /// given predicate. /// </summary> /// <param name="predicate">A condition to filter entities</param> void Delete(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Deletes many entities by function. /// Notice that: All entities fits to given predicate are retrieved and deleted. /// This may cause major performance problems if there are too many entities with /// given predicate. /// </summary> /// <param name="predicate">A condition to filter entities</param> Task DeleteAsync(Expression<Func<TEntity, bool>> predicate); #endregion #region Aggregates /// <summary> /// Gets count of all entities in this repository. /// </summary> /// <returns>Count of entities</returns> int Count(); /// <summary> /// Gets count of all entities in this repository. /// </summary> /// <returns>Count of entities</returns> Task<int> CountAsync(); /// <summary> /// Gets count of all entities in this repository based on given <paramref name="predicate"/>. /// </summary> /// <param name="predicate">A method to filter count</param> /// <returns>Count of entities</returns> int Count(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Gets count of all entities in this repository based on given <paramref name="predicate"/>. /// </summary> /// <param name="predicate">A method to filter count</param> /// <returns>Count of entities</returns> Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Gets count of all entities in this repository (use if expected return value is greather than <see cref="int.MaxValue"/>. /// </summary> /// <returns>Count of entities</returns> long LongCount(); /// <summary> /// Gets count of all entities in this repository (use if expected return value is greather than <see cref="int.MaxValue"/>. /// </summary> /// <returns>Count of entities</returns> Task<long> LongCountAsync(); /// <summary> /// Gets count of all entities in this repository based on given <paramref name="predicate"/> /// (use this overload if expected return value is greather than <see cref="int.MaxValue"/>). /// </summary> /// <param name="predicate">A method to filter count</param> /// <returns>Count of entities</returns> long LongCount(Expression<Func<TEntity, bool>> predicate); /// <summary> /// Gets count of all entities in this repository based on given <paramref name="predicate"/> /// (use this overload if expected return value is greather than <see cref="int.MaxValue"/>). /// </summary> /// <param name="predicate">A method to filter count</param> /// <returns>Co以上是关于ABP框架服务层的接口与实现(增删改查)的主要内容,如果未能解决你的问题,请参考以下文章