在ABP框架中创建Person的应用服务

应用服务通常是为了给客户端(展现层)服务所使用的,它用来执行应用程序的操作实例。

应用程序服务的实现类和接口以及DTO位于.Application项目中。

首先我们定义一个接口。(当然接口的定义是可选的,只是我建议你创建一个)。

在项目中创建接口,路径:PhoneBooks\Persons\IPersonApplicationService.cs

namespace YoyoSoft.PhoneBookDemo.PhoneBooks.Persons
{

    /// <summary>
    /// Person的应用程序服务
    /// </summary>
    public interface IPersonApplicationService: IApplicationService
    {
        ListResultDto<PersonListDto> GetPeople(GetPeopleInput input);

    }
}

在接口中,我们添加一个GetPeople方法,用于返回Dto信息。关于Dto的信息可以参考文档:数据传输对象

返回类型ListResultDto是一个预构建的DTO辅助类,用于返回另一个DTO的集合。 GetPeopleInput是用于将请求参数传递给GetPeople方法的DTO。

因此,GetPeopleIntput和PersonListDto的定义如下所示:


 
    public class GetPeopleInput
    {
        public string Filter { get; set; }
    }
   public class PersonListDto : FullAuditedEntityDto<Guid>
    {
        /// <summary>
        ///     姓名
        /// </summary>

        public string Name { get; set; }

        /// <summary>
        ///     邮箱
        /// </summary>

        public string EmailAddress { get; set; }

        /// <summary>
        ///     地址信息
        /// </summary>
        public string Address { get; set; }
    }
 

CustomerAppDtoMapper.cs用于创建从PersonPersonListDto的映射。PersonListDto继承FullAuditedEntityDto以自动实现审计属性。 有关更多信息,请参见应用程序服务DTO文档

现在我们在CustomerAppDtoMapper类中添加以下映射。

configuration.CreateMap<Person, PersonListDto>();

在定义了接口之后,我们需要实现这些接口定义的方法,代码如下:

    public class PersonApplicationService : PhoneBookDemoAppServiceBase, IPersonApplicationService
    {
        private readonly IRepository<Person, Guid> _personRepository;

        public PersonApplicationService(IRepository<Person, Guid> personRepository)
        {
            _personRepository = personRepository;
        }

        public ListResultDto<PersonListDto> GetPeople(GetPeopleInput input)
        {
            var people = _personRepository
                .GetAll()
                .WhereIf(
                    !input.Filter.IsNullOrEmpty(),
                    p => p.Name.Contains(input.Filter) ||
                         p.Address.Contains(input.Filter) ||
                         p.EmailAddress.Contains(input.Filter)
                )
                .OrderBy(p => p.Name)
                .ThenBy(p => p.Address)
                .ToList();

            return new ListResultDto<PersonListDto>(ObjectMapper.Map<List<PersonListDto>>(people));
        }
    }

我们注入了Person的仓储服务(它是由ABP自动创建的),接下来使用仓储服务来过滤数据库并从数据库中查询信息。

  • WhereIf是此处的扩展方法(在Abp.Linq.Extensions命名空间中定义)。仅当filter不为null或为空时,它才执行Where条件。
  • IsNullOrEmpty也是扩展方法(在Abp.Extensions命名空间中定义)。52ABP中有许多类似的快捷方式扩展方法。

ObjectMapper.Map方法使用 .Application项目中的CustomerAppDtoMapper中的配置,它自动将Person实体列表转换为PersonListDto对象列表。

关于事物的提交

我们不会手动打开数据库连接或手动启动/提交事务。它是通过ABP框架的工作单元自动完成的。有关更多信息,请参见UOW工作单元文档

关于异常拦截

我们不会手动处理异常(使用try-catch块即可)。因为ABP框架会自动处理Web层上的所有异常并向客户端返回适当的错误消息

然后,它自动处理客户端上的错误,并向用户显示所需的错误信息。有关更多信息,请参见异常处理文档。

下一篇