ABP 接口开发步骤
一.数据库生成
1. 创建实体
在MyCompanyName.AbpZeroTemplate 下创建实体。
[Table("TelphoneBook")]
public class TelphoneBook : Entity<string>, IHasCreationTime, IMayHaveTenant, IHasDeletionTime, IHasModificationTime
{
/// <summary>
/// 电话号码
/// </summary>
[Required]
[StringLength(11)]
public string PhoneNumber { get; set; }
/// <summary>
/// 姓
/// </summary>
[Required]
[StringLength(50)]
public string FirstName { get; set; }
/// <summary>
/// 名
/// </summary>
[Required]
[StringLength(50)]
public string LastName { get; set; }
public DateTime CreationTime { get; set; }
public int? TenantId { get; set; }
public DateTime? DeletionTime { get; set; }
public bool IsDeleted { get; set; }
public DateTime? LastModificationTime { get; set; }
}
2. 生成数据库表
在MyCompanyName.AbpZeroTemplate.EntityFrameworkCore
下添加,在重写的 OnModelCreating(ModelBuilder modelBuilder)
方法中可以设置表的索引等
public virtual DbSet<TelphoneBook> TelphoneBooks { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<TelphoneBook>(b => {
b.HasIndex(e => new { e.TenantId, e.PhoneNumber });
});
modelBuilder.ConfigurePersistedGrantEntity();
}
上面步骤完成后,在控制台执行 Add-Migration MyCompanyName.AbpZeroTemplate.Telbook.TelphoneBook
执行成功后,接着执行更新操作 Update-Database
接口部分
在MyCompanyName.AbpZeroTemplate.Application.Shared
添加以下内容
namespace MyCompanyName.AbpZeroTemplate.Telbook.Dto
{
public class TelphoneBookDto : EntityDto<string>, IHasCreationTime, IMayHaveTenant, IHasDeletionTime, IHasModificationTime
{
/// <summary>
/// 电话号码
/// </summary>
public string PhoneNumber { get; set; }
/// <summary>
/// 姓
/// </summary>
public string FirstName { get; set; }
/// <summary>
/// 名
/// </summary>
public string LastName { get; set; }
public DateTime CreationTime { get; set; }
public int? TenantId { get; set; }
public DateTime? DeletionTime { get; set; }
public bool IsDeleted { get; set; }
public DateTime? LastModificationTime { get; set; }
}
}
namespace MyCompanyName.AbpZeroTemplate.Telbook
{
public interface ITelBookAppService: IApplicationService
{
PagedResultDto<TelphoneBookDto> GetTelBooks(GetTelBooksInput input);
Task CreateOrUpdateTelBook(CreateOrUpdateTelbookInput input);
Task DeleteTelBook(string id);
}
}
namespace MyCompanyName.AbpZeroTemplate.Telbook.Dto
{
/// <summary>
/// 查询用
/// </summary>
public class GetTelBooksInput : PagedAndSortedInputDto
{
public string PhoneNumber { get; set; }
}
}
在MyCompanyName.AbpZeroTemplate
下实现ITelBookAppService
接口
[AbpAuthorize(AppPermissions.Pages_Telbooks)]
public class TelBookAppService : AbpZeroTemplateAppServiceBase, ITelBookAppService
{
private readonly IRepository<TelphoneBook, string> _telbookRepository;
public TelBookAppService(IRepository<TelphoneBook, string> telbookRepository)
{
_telbookRepository = telbookRepository;
}
[HttpPost]
public async Task CreateOrUpdateTelBook(CreateOrUpdateTelbookInput input)
{
if (string.IsNullOrEmpty(input.Id))
{
await UpdateTelbookAsync(input);
}
else
{
await CreateTelbookAsync(input);
}
}
[HttpPost]
public async Task UpdateTelbookAsync(CreateOrUpdateTelbookInput input)
{
Debug.Assert(input.Id != null, "input.Id != null");
await CheckTelbookIfAlreadyExists(input.PhoneNumber);
var info = await _telbookRepository.GetAsync(input.Id);
info.PhoneNumber = input.PhoneNumber;
info.FirstName = input.FirstName;
info.LastName = input.LastName;
info.IsDeleted = false;
info.LastModificationTime = DateTime.UtcNow;
await _telbookRepository.UpdateAsync(info);
}
[HttpPost]
public async Task CreateTelbookAsync(CreateOrUpdateTelbookInput input)
{
await CheckTelbookIfAlreadyExists(input.PhoneNumber);
await _telbookRepository.InsertAsync(
new TelphoneBook()
{
Id = input.Id,
FirstName = input.FirstName,
LastName = input.LastName,
PhoneNumber = input.PhoneNumber,
IsDeleted = false,
TenantId = AbpSession.TenantId,
CreationTime = DateTime.UtcNow,
}
);
}
[HttpPost]
public async Task DeleteTelBook(string id)
{
var info = await _telbookRepository.GetAsync(id);
await _telbookRepository.DeleteAsync(info);
}
[HttpPost]
public PagedResultDto<TelphoneBookDto> GetTelBooks(GetTelBooksInput input)
{
var query = _telbookRepository.GetAll();
var Count = query.Count();
if (!input.Sorting.IsNullOrEmpty())
{
query = query.OrderBy(input.Sorting);
}
//Paging
if (input.SkipCount > 0)
{
query = query.Skip(input.SkipCount);
}
if (input.MaxResultCount > 0)
{
query = query.Take(input.MaxResultCount);
}
var ListDtos = ObjectMapper.Map<List<TelphoneBookDto>>(query.ToList());
return new PagedResultDto<TelphoneBookDto>(
Count,
ListDtos
);
}
private async Task CheckTelbookIfAlreadyExists(string phonenumber)
{
var obj = (await _telbookRepository.GetAllListAsync())
.FirstOrDefault(l => l.PhoneNumber == phonenumber);
if (obj == null)
{
return;
}
throw new UserFriendlyException(L("ThisTelNumberAlreadyExists"));
}
}
最后一步,在 MyCompanyName.AbpZeroTemplate.CreateMappings
添加实体映射(这里真的很重要)。
//TelBook
configuration.CreateMap<TelphoneBook, TelphoneBookDto>();
最后运行MyCompanyName.AbpZeroTemplate.Web.Host
访问*https://localhost:44301/swagger/index.html
*
备注: 由于使用的数据库为PostGreSql, 里面涉及到的时间为 UTC格式, 所以这个一定要处理, 要不然无法正常访问。可以在启动程序中设置全局时间格式。
//设置UTC时间格式
Clock.Provider = ClockProviders.Utc;
刚开始写博客, 若有不足之处, 还请各位见谅。