给应用服务添加电话和删除电话两个方法

我们正在向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来插入新电话信息。它们都有各自的优缺点。你可以自己选择。

接下来