个人认为应用服务层的搭建是ABP框架的核心,掌握了这个就能基本上手工作了,在上一个博客中我们创建了一个分类表实体类,这次我们就围绕这个实体类实现增删改查的方法。
一:创建好相关的目录结构
首先我们在应用层下建立相关的文件夹存放Dto(数据传输对象)以及接口、方法实现类等,使用Dto可以更好的做到表现层与模型层的解耦,也可以更方便序列化!
二:实现Dto类与实体的映射
创建一个基础的Dto类
如果Dto类与实体类,类型相同的情况下可以直接在Dto类的头部实现自动映射(如图所示),如果有类型不相同的情况那么必须自定义映射规则!
我这里举一个简单的例子吧!更详细的用法可以自行上网百度AutoMapper的教程!
打开位于应用层中的***AbpApplicationModule类
//自定义映射规则
cfg.CreateMap<Channels.Channel, Channels.Dto.ChannelDto().ForMember(dto => dto.state, map => map.MapFrom(m => m.state == 1 ? true : false));
到这里基础的Dto类就创建完成了!然后我们在创建一个类用于查询需要的输入参数:
三:创建服务接口与实现类
服务接口和实现类的命名必须规范如:IChannelAppService、ChannelAppService,接口前面加I,首字母需要大写,结尾必须为***AppService!
接口代码:
public interface IChannelAppService: IApplicationService
{
/// <summary>
/// 查找栏目列表
/// </summary>
/// <param name="getTourDeIn"></param>
/// <returns></returns>
List<ChannelDto> GetChannelList(GetChannelInput input);
/// <summary>
/// 插入栏目
/// </summary>
/// <param name="Channel"></param>
/// <returns></returns>
int InsertChannel(ChannelDto Channel);
/// <summary>
/// 更新栏目
/// </summary>
/// <param name="Channel"></param>
/// <returns></returns>
int UpdateChannel(ChannelDto Channel);
/// <summary>
/// 删除栏目
/// </summary>
/// <param name="Channel"></param>
/// <returns></returns>
int DelChannel(int id);
/// <summary>
/// 分页获取栏目
/// </summary>
/// <param name="showHidden"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
IPagedResult<ChannelDto> GetChannelPageList(List<ChannelDto> ChannelList, bool showHidden = false, int pageIndex = 0, int pageSize = int.MaxValue);
/// <summary>
/// 获取栏目详细信息
/// </summary>
/// <param name="getTourDeIn"></param>
/// <returns></returns>
ChannelDto GetChannel(GetChannelInput input);
}
实现代码:
public class ChannelAppService : BlogAbpAppServiceBase, IChannelAppService
{
#region 注入
public IRepository<Channel> _iRepository;
public ChannelAppService(IRepository<Channel> iRepository)
{
_iRepository = iRepository;
}
#endregion
#region curd函数
/// <summary>
/// 查找栏目列表
/// </summary>
/// <param name="getTourDeIn"></param>
/// <returns></returns>
public List<ChannelDto> GetChannelList(GetChannelInput input)
{
List<ChannelDto> Channel = new List<ChannelDto>();
if (input != null)
{
Channel = Mapper.Map<List<ChannelDto>>(_iRepository.GetAll().Where(c => c.state == 1)
//.WhereIf(!string.IsNullOrEmpty(getTourDeIn.Name), c => c.Name.Contains(getTourDeIn.Name)) 可自主增加条件
);
}
return Channel;
}
/// <summary>
/// 插入栏目
/// </summary>
/// <param name="Channel"></param>
/// <returns></returns>
public int InsertChannel(ChannelDto geChannel)
{
try
{
Channel Channel = Mapper.Map<ChannelDto, Channel>(geChannel);
return _iRepository.InsertAndGetId(Channel);
}
catch (System.Exception)
{
return 0;
}
}
/// <summary>
/// 更新栏目
/// </summary>
/// <param name="Channel"></param>
/// <returns></returns>
public int UpdateChannel(ChannelDto geChannel)
{
try
{
Channel Channel = Mapper.Map<ChannelDto, Channel>(geChannel);
_iRepository.Update(Channel);
return 1;
}
catch (System.Exception)
{
return 0;
}
}
/// <summary>
/// 删除栏目
/// </summary>
/// <param name="Channel"></param>
/// <returns></returns>
public int DelChannel(int id)
{
try
{
_iRepository.Delete(id);
return 1;
}
catch (Exception)
{
return 0;
}
}
/// <summary>
/// 分页获取栏目
/// </summary>
/// <param name="showHidden"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IPagedResult<ChannelDto> GetChannelPageList(List<ChannelDto> ChannelList, bool showHidden = false, int pageIndex = 0, int pageSize = int.MaxValue)
{
PagedResult<ChannelDto> Channel = new PagedResult<ChannelDto>(ChannelList, pageIndex, pageSize);
return Channel;
}
/// <summary>
/// 获取栏目详细信息
/// </summary>
/// <param name="getTourDeIn"></param>
/// <returns></returns>
public ChannelDto GetChannel(GetChannelInput input)
{
ChannelDto Channel = new ChannelDto();
Channel = Mapper.Map<Channel, ChannelDto>(_iRepository.Get(input.Id));
return Channel;
}
#endregion
}
代码中引用了一个自定义的分页实现类,代码奉上:
/// <summary>
/// 分页查询实现类
/// </summary>
/// <typeparam name="T">T对象为实体对象的继承类</typeparam>
[Serializable]
public class PagedResult<T> : IPagedResult<T> where T : class, new()
{
/// <summary>
/// 实例化
/// </summary>
/// <param name="source">数据源</param>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">页大小</param>
public PagedResult(IQueryable<T> source, int pageIndex, int pageSize)
{
int total = source.Count();
this.TotalCount = total;
this.Items = source.Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
/// <summary>
/// 实例化
/// </summary>
/// <param name="source">数据源</param>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">页大小</param>
public PagedResult(IList<T> source, int pageIndex, int pageSize)
{
int total = source.Count();
this.TotalCount = total;
this.Items = source.Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
/// <summary>
/// 数据集
/// </summary>
public IReadOnlyList<T> Items { get; set; }
/// <summary>
/// 总个数
/// </summary>
public int TotalCount { get; set; }
}
应用层的创建大概就是这些,接下来就是web层如何实现了~~