Índice
Em grande parte de nosso sistema, muitas telas precisam contém conter apenas uma lógica de CRUD básica (Create, Read, Update e Delete).
Visando uma maior produtividade, o TNF contém trás classes que agilizam essa criação de serviços de forma automática.
Para utilizar essas funcionalidades instale via nuget o pacote Tnf Tnf e Tnf.App.EntityFrameworkCore disponível em nosso package source: https://www.myget.org/F/tnf/api/v3/index.json
Primeiro vamos criar nossa interface para o serviço deaplicação definindo sua herança para a interface IAsyncCrudAppService<CountryDto> informando qual o Dto que será usado para o mapeamento da entidade:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public interface ICountryAppService : IAsyncCrudAppService<CountryDto> { } |
No exemplo acima criamos um serviço para trabalhar com o objeto CountryDto representando a entidade persistida com Entity Framework Core.
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class CountryDto : CustomValidate { public string Name { get; set; } public override void AddValidationErrors(CustomValidationContext context) { if (string.IsNullOrWhiteSpace(Name)) { context.Results.Add(new ValidationResult("Name is required")); } } } |
Acima temos a definição de nosso DTO usando a herança de uma classe chamada CustomValidate. Essa classe realiza a validação do objeto DTO ao criar o serviço automático. Nela podem ser adicionadas regras de validação personalizadas.
Para a tabela "Countries" temos a seguinte definição:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[AutoMap(typeof(CountryDto))] [Table("Countries")] public class Country : Entity { public const int MaxNameLength = 256; [Required] [MaxLength(MaxNameLength)] public string Name { get; set; } public Country() { } public Country(int id, string name) { Id = id; Name = name; } } |
...
Para utilizar o AutoMapper consulte o tópico de Mapeamento Automático de Entidades.
Agora vamos implementar a nossa classe de serviço:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class CountryAppService : AsyncCrudAppService<Country, CountryDto>, ICountryAppService { public CountryAppService(IRepository<Country> repository) : base(repository) { } } |
...
Após a definição acima o serviço de aplicação pode ser usado normalmente em sua aplicação.
A herança da classe AsyncCrudAppService< Entity, Dto> expõe o CRUD no formato assíncrono. Também existe a versão síncrona do serviço de CRUD usando a herança CrudAppService< Entity, Dto>