创建Person的应用服务
应用服务是用来被客户端(表现层)调用执行逻辑操作。
应用服务是放在.Application项目中。我们创建第一应用服务用来从服务端获取Person信息。
首先在Application项目中创建一个叫Person的文件夹,再在Person文件夹下创建一个叫Dto的文件夹。
创建一个接口来定义Person应用服务:
public interface IPersonAppService: IApplicationService
{
ListResultDto<PersonListDto> GetPeople(GetPeopleInput input);
}
应用服务是用来获取或返回DTO对象,ListResultDto是框架创建用来返回DTO对象列表的帮助类。GetPeopleInput是GetPeople方法的请求参数。所以,GetPeopleInput和PersonListDto 定义如下:
public class GetPeopleInput
{
public string Filter { get; set; }
}
[AutoMapFrom(typeof(Entities.Person))]
public class PersonListDto : FullAuditedEntityDto
{
public string Name { get; set; }
public string Surname { get; set; }
public string EmailAddress { get; set; }
}
AutoMapFrom属性是使用AutoMapper创建Person和PersonListDto的映射。FullAuditedEntityDto包含了审计属性。参见应用服务和DTO文档了解更多。
当定义完接口后,我们如下面所示来进行实现:
public class PersonAppService : AbpZeroTemplateAppServiceBase, IPersonAppService
{
private readonly IRepository<Entities.Person> _personRepository;
public PersonAppService(IRepository<Entities.Person> personRepository)
{
this._personRepository = personRepository;
}
public ListResultDto<PersonListDto> GetPeople(GetPeopleInput input)
{
var persons = this._personRepository
.GetAll()
.WhereIf(
!input.Filter.IsNullOrEmpty(),
p => p.Name.Contains(input.Filter) ||
p.Surname.Contains(input.Filter) ||
p.EmailAddress.Contains(input.Filter)
)
.OrderBy(p => p.Name)
.ThenBy(p => p.Surname)
.ToList();
return new ListResultDto<PersonListDto>(persons.MapTo<List<PersonListDto>>());
}
}
我们注入Person Repository并使用它从数据库过滤并获取Person的信息。
WhereIf是一个扩展方法(在Abp.Linq.Extensions命名空间中定义)。只用当Filter不为Null或Empty,它才执行Where条件语句。
IsNullOrEmpty也是一个扩展方法(在Abp.Extensions命名空间中定义)。ABP拥有许多类似的快捷扩展方法。
MapTo方法通过使用AutoMapper自动将 Person 对象列表转换为 PersonListDto 对象列表
连接与事务管理
我们不用手动打开数据库连接或开启/提交事务。在ABP框架的工作单元(Unit Of Work)系统中已进行了自动处理。见UOW了解更多。
错误捕获
我们不用手动捕获错误(使用Try-Catch),因为ABP框架会自动在Web层捕获所有错误并返回适当的错误消息至客户端。然后在客户端捕获错误并向用户显示所需的错误信息。见错误捕获了解更多。