给应用服务添加电话和删除电话两个方法
我们正在向IPersonAppService接口添加另外两种方法,如下所示:
Task DeletePhone(EntityDto<long> input);
Task<PhoneInPersonListDto> AddPhone(AddPhoneInput input);
你也可以创建一个新的 IPhoneAppService 类,这是你的自由。在这里我们可以将Person视为一个汇总,在此处添加与电话相关的方法。
如下所示:
public class AddPhoneInput
{
public Guid PersonId { get; set; }
[Required]
public PhoneType Type { get; set; }
[Required]
[MaxLength(Phone.MaxNumberLength)]
public string Number { get; set; }
}
现在,我们可以实现以下方法:
[AbpAuthorize(AppPermissions.Pages_Tenant_PhoneBook_EditPerson)]
public async Task DeletePhone(EntityDto<long> input)
{
await _phoneRepository.DeleteAsync(input.Id);
}
[AbpAuthorize(AppPermissions.Pages_Tenant_PhoneBook_EditPerson)]
public async Task<PhoneInPersonListDto> AddPhone(AddPhoneInput input)
{
//仅获取到person实体内容
var person = await _personRepository.GetAsync(input.PersonId);
//加载person的关联属性Phone实体的信息
await _personRepository.EnsureCollectionLoadedAsync(person, p => p.Phones);
var phone = ObjectMapper.Map<Phone>(input);
person.Phones.Add(phone);
//通过保存到数据库来获取新手机号码的自增ID
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<PhoneInPersonListDto>(phone);
}
然后,将AutoMapper的配置添加到CustomerAppDtoMapper.cs
中,如下所示:
configuration.CreateMap<AddPhoneInput, Phone>();
注意:我们在构造函数中注入了IRepository <Phone,long>并设置为_phoneRepository字段,类似于_personRepository。这是仓储模式。
DeletePhone方法很简单。给予指定的Id即可删除。
AddPhone方法需要从数据库获取联系人信息,并将新电话添加到person.Phones集合中,然后执行保存。 保存后,会将新添加的电话号码信息,插入数据库并获取其ID。因为,我们要求返回的DTO包含新创建的电话信息(包括ID)。
因此,在执行automapper映射之前,需要提前取得Id的信息。所以我们调用了CurrentUnitOfWork.SaveChangesAsync。
请注意;通常不需要调用CurrentUnitOfWork.SaveChangesAsync,它会在方法的最后自动调用。而现在调用它是因为我们需要获取我们保存到数据库实体的Id信息。可以查看工作单元文档。
当然是用 AddPhone方法还有其他的用法,比如您可以直接使用_personRepository
来插入新电话信息。它们都有各自的优缺点。你可以自己选择。