ุดูˆู ุงู„ู€ Output ุจุชุงุนูƒ

  • ู„ูˆ ู„ู‚ูŠุช ููŠู‡ NestedุŒ ุงุณุฃู„ ู†ูุณูƒ: ู‡ู„ ู…ุญุชุงุฌู‡ ูˆู„ุง ู„ุฃุŸ
  • ุบุงู„ุจู‹ุง ู…ุด ู‡ู†ุญุชุงุฌ ู†ุธู‡ุฑ ุงู„ู€ Id ู…ุฑุชูŠู† ุฃูˆ ุฃูƒุชุฑุŒ ุฒูŠ ููŠ ุญุงู„ุฉ ุงู„ู€ Brand ุฃูˆ ุงู„ู€ Category.
  • ูŠุนู†ูŠ ุจุฏู„ ู…ุง ู†ุธู‡ุฑ ุงู„ู€ Id ู…ุน ุงู„ุงุณู…ุŒ ู…ู…ูƒู† ู†ุธู‡ุฑ ุงู„ุงุณู… ุจุณ ุนุดุงู† ู†ุณู‡ู„ ุงู„ุดุบู„ ุนู„ู‰ ุงู„ู€ Front-end developer.
  • ุฏุงูŠู…ู‹ุง ุฎู„ูŠูƒ ููŠ ุงู„ู€ Output Flat ู„ูˆ ู…ููŠุด ุฏุงุนูŠ ู„ู„ู€ Nesting.


View Model vs Model

  • ุงู„ููƒุฑุฉ ู‡ู†ุง ุฅู† ุงู„ู…ุดุงูƒู„ ุงู„ู„ูŠ ุนู†ุฏู†ุง ููŠ ุงู„ู€ Back ู…ุง ุชุฎุตุด ุงู„ู€ Front-end.
  • ุนุดุงู† ูƒุฏู‡ ุจู†ุจุนุช View Model ุจุฏู„ ู…ุง ู†ุจุนุช ุงู„ู€ Model ู†ูุณู‡.
  • ููŠ ู†ุธุงู… ุงู„ู€ MVC:
    • ุจู†ุนู…ู„ Map ู…ู† ุงู„ู€ Model ู„ู€ View Model ููŠ ุงู„ู€ Get.
    • ูˆู…ู† ุงู„ู€ View Model ู„ู€ Model ููŠ ุงู„ู€ Create, Update, ูˆ Delete.

ุงู„ูุฑู‚ ุจูŠู† View Model ูˆ DTO

  • ููŠ ุงู„ู€ API ู…ููŠุด ุญุงุฌุฉ ุงุณู…ู‡ุง View ModelุŒ ู„ูƒู† ููŠู‡ ุญุงุฌุฉ ุงุณู…ู‡ุง DTO (Data Transfer Object).
  • ุงู„ู€ DTO ุจุชูƒูˆู† ุงู„ูˆุณูŠุท ุจูŠู† ุงู„ู€ Back ูˆุงู„ู€ Front:
    • ุงู„ู€Get: ู…ู† ุงู„ู€ Back ู„ู„ู€ Front.
    • ุงู„ู€Create, Update, Delete: ู…ู† ุงู„ู€ Front ู„ู„ู€ Back.

ุฎุทูˆุงุช ุฅู†ุดุงุก ุงู„ู€ DTO

  1. ุฅุถุงูุฉ ููˆู„ุฏุฑ Dtos:
    • ููŠ ุงู„ู€ API ู†ุนู…ู„ ููˆู„ุฏุฑ ุงุณู…ู‡ Dtos.
    • ู†ุนู…ู„ ูƒู„ุงุณ ุงุณู…ู‡ ProductToReturnDto.
  2. ุฅุนุฏุงุฏ ุงู„ู€ ProductToReturnDto:
    • ู†ุงุฎุฏ ุงู„ุญุงุฌุงุช ุงู„ู„ูŠ ู…ุญุชุงุฌูŠู†ู‡ุง ู…ู† ุงู„ู€ Product ูˆู†ุญุทู‡ุง ููŠ ุงู„ูƒู„ุงุณ.
    • ุงู„ูƒู„ุงุณ ู…ุด ู‡ูŠูˆุฑุซ ู…ู† ุงู„ู€ BaseEntity.
    • ู†ุถูŠู ุงู„ู€ Properties ุจุงู„ุดูƒู„ ุงู„ุชุงู„ูŠ:
public class ProductToReturnDto
{
	public int Id { get; set; }
	public string? Name { get; set; }
	public string? Description { get; set; }
	public decimal Price { get; set; }
	public string PictureUrl { get; set; }
	public string Brand { get; set; }
	public int BrandId { get; set; }
	public string Category { get; set; }
	public int CategoryId { get; set; }
}
  1. ุฅุถุงูุฉ AutoMapper:
    • ู†ุนู…ู„ Install ู„ู„ู€ AutoMapper ููŠ ู…ุดุฑูˆุน ุงู„ู€ API.
    • ู†ุญุทู‡ุง ููŠ ุงู„ู€ Services:
builder.Services.AddAutoMapper(typeof(MappingProfiles));

AutoMapper.Extensions.Microsoft.DependencyInjection


ุฅุนุฏุงุฏ Mapping Profiles

  1. ุฅู†ุดุงุก ูƒู„ุงุณ MappingProfiles:
    • ู†ุฑูˆุญ ููŠ ููˆู„ุฏุฑ ุงู„ู€ Dtos ูˆู†ุนู…ู„ ููˆู„ุฏุฑ ุฌุฏูŠุฏ ุงุณู…ู‡ Helpers.
    • ู†ุนู…ู„ ูƒู„ุงุณ ุงุณู…ู‡ MappingProfiles ูˆูŠูˆุฑุซ ู…ู† ูƒู„ุงุณ Profile.
  2. ุฅุนุฏุงุฏ ุงู„ู…ุงุจ:
    • ููŠ ุงู„ูƒู„ุงุณ ู†ุนู…ู„ Map ุจูŠู† ุงู„ู€ Product ูˆุงู„ู€ ProductToReturnDto:
public class MappingProfiles : Profile
{
	public MappingProfiles()
	{
		CreateMap<Product, ProductToReturnDto>()
			.ForMember(d => d.Brand, O => O.MapFrom(s => s.Brand.Name))
			.ForMember(d => d.Category, O => O.MapFrom(s => s.Category.Name));
	}
}
  • ู…ู† ุงู„ู€ Destination ุฑูˆุญ ุงุนู…ู„ Map ู…ู† ุงู„ู€ Source ูˆุงุญุฏุฏ ุงูŠู‡ ุจุงู„ุธุจุท

ุชุนุฏูŠู„ ุงู„ู€ Controller

  1. ุฅุถุงูุฉ IMapper:
    • ู†ุนุฏู„ ุงู„ู€ Constructor ุจุชุงุน ุงู„ู€ Controller ุนุดุงู† ูŠู‚ุจู„ ุงู„ู€ IMapper:
private readonly IGenericRepository<Product> _productsRepo;
private readonly IMapper _mapper;
 
public ProductsController(IGenericRepository<Product> productsRepo, IMapper mapper)
{
	_productsRepo = productsRepo;
	_mapper = mapper;
}
  1. GetProduct:
    • ุฅุถุงูุฉ ู…ูŠุซูˆุฏ ู„ู„ู€ Get ุนุดุงู† ุชุฑุฌู‘ุน ุงู„ู€ DTO:
[HttpGet("{id}")]
public async Task<ActionResult<ProductToReturnDto>> GetProduct(int id)
{
	var product = await _productsRepo.GetAsync(id);
	if (product == null)
		return NotFound(new { message = "Not Found", statusCode = 404 });
 
	return Ok(_mapper.Map<Product, ProductToReturnDto>(product));
}
  1. GetProducts:
    • ู…ูŠุซูˆุฏ ุชุฑุฌู‘ุน ูƒู„ ุงู„ู…ู†ุชุฌุงุช ุจู€ DTO:
[HttpGet]
public async Task<ActionResult<IEnumerable<ProductToReturnDto>>> GetProducts()
{
	var products = await _productsRepo.GetAllWithSpecAsync(new ProductWithBrandAndCategorySpecifications());
	if (products == null || !products.Any())
		return NotFound("No Products available");
 
	return Ok(_mapper.Map<IEnumerable<Product>, IEnumerable<ProductToReturnDto>>(products));
}