EndPoint.Site => Areas => Admin => Views => Categories => Index.cshtml
بیایید کد صفحه نمایشی دستهبندیها را که در فایل ویو Index استفاده شده است بررسی کنیم.
توضیحات کد:
Imports و مدل:
csharp
@using Test_Store.Application.Services.Products.Queries.GetCategories
@model List<CategoriesDto>
@using
برای استفاده از فضای نام سرویسهای مورد نیاز برای دریافت دستهبندیها.
@model
برای تعریف مدل دادهای که به ویو ارسال میشود. در اینجا یک لیست از CategoriesDto.
ViewData و Layout:
csharp
@{
ViewData["Title"] = "Index";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
ViewData["Title"]:
عنوان صفحه را به "Index" تنظیم میکند.
Layout:
از Layout مشخص شده برای این صفحه استفاده میکند.
ساختار HTML:
بخشهای مختلف صفحه شامل هدر، بدنه، و جدول برای نمایش دستهبندیها.
بخش اصلی نمایش جدول دستهبندیها:
html
<section id="configuration">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<div class="card-title-wrap bar-success">
<h4 class="card-title">لیست دسته بندی ها</h4>
</div>
</div>
<div class="card-body collapse show">
<div class="card-block card-dashboard">
<p class="card-text">دسته بندی محصولات فروشگاه </p>
<a href="~/admin/categories/addnewcategory" class="btn btn-success">افزودن دسته بندی جدید</a>
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper container-fluid dt-bootstrap4">
<div class="col-sm-12">
<table class="table table-striped table-bordered zero-configuration dataTable" id="DataTables_Table_0" role="grid" aria-describedby="DataTables_Table_0_info">
<thead>
<tr role="row">
<th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="دسته بندی: activate to sort column descending" style="width: 222px;">دسته بندی</th>
<th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="پدر: activate to sort column descending" style="width: 222px;">پدر</th>
<th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label=": activate to sort column descending" style="width: 222px;"></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr role="row" class="odd">
<td class="sorting_1">@item.Name</td>
<td>
@{
string parent = item.Parent != null ? item.Parent.name : "-";
}
<text> @parent </text>
</td>
<td>
@if (item.Parent == null)
{
<a href="~/admin/categories/addnewcategory?ParentId=@item.Id" class="btn btn-success">افزودن فرزند</a>
}
@if (item.HasChild == true)
{
<a href="~/admin/categories/index?ParentId=@item.Id" class="btn btn-info">مشاهده لیست فرزند ها </a>
}
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
جدول نمایش دستهبندیها:
ستونهای دسته بندی، پدر و گزینههای مدیریت دستهبندیها (افزودن فرزند، مشاهده لیست فرزندان).
از foreach برای پیمایش مدل (لیست دستهبندیها) و نمایش اطلاعات هر دستهبندی استفاده شده است.
نتیجهگیری:
این کد به شما امکان میدهد تا لیست دستهبندیهای محصولات را به صورت جدولی نمایش دهید. هر ردیف شامل نام دستهبندی، پدر (در صورت وجود) و دکمههای افزودن فرزند و مشاهده لیست فرزندان است. از foreach برای پیمایش لیست دستهبندیها استفاده میشود و اطلاعات در جدول به صورت پویا نمایش داده میشود.
EndPoint.Site => Areas => Admin => Views => Categories => AddNewCategory.cshtml
بیایید کد صفحهی AddNewCategory را که برای اضافه کردن دستهبندی جدید به محصولات استفاده میشود بررسی کنیم.
توضیحات کد:
ViewData و Layout:
csharp
@{
ViewData["Title"] = "AddNewCategory";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
ViewData["Title"]: عنوان صفحه را به "AddNewCategory" تنظیم میکند.
Layout: از Layout مشخص شده برای این صفحه استفاده میکند.
ساختار اصلی HTML:
استفاده از تگ section برای تعریف بخش اصلی صفحه.
در اینجا از کلاسهای Bootstrap برای تنظیمات واکنشگرا استفاده شده است.
بخش اصلی فرم اضافه کردن دستهبندی:
html
<section class="basic-elements">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<div class="card-title-wrap bar-success">
<h4 class="card-title mb-0">اضافه کردن دسته بندی جدید برای محصولات</h4>
</div>
</div>
<div class="card-body">
<div class="px-3">
<div class="form">
<div class="form-body">
<div class="row">
<div class="col-xl-4 col-lg-6 col-md-12 mb-1">
<fieldset class="form-group">
<input type="hidden" id="parentId" value="@ViewBag.parentId" />
<label for="basicInput">نام دسته بندی</label>
<input type="text" class="form-control" id="Name">
</fieldset>
</div>
<div class="col-xl-12 col-lg-12 col-md-12 mb-1">
<fieldset class="form-group">
<br />
<a onclick="AddNewCategory()" class="btn btn-success col-md-12">اضافه کردن به لیست</a>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
فرم اصلی شامل یک فیلد ورودی برای نام دستهبندی و یک دکمه برای اضافه کردن دستهبندی است.
از ViewBag.parentId برای تنظیم مقدار parentId استفاده میشود.
بخش اسکریپت:
csharp
@section Scripts
{
<link href="~/Sweetalert2/sweetalert2.min.css" rel="stylesheet" />
<script src="~/Sweetalert2/sweetalert2.min.js"></script>
<script>
function AddNewCategory() {
swal.fire({
title: 'دسته بندی جدید',
text: "آیا میخواهید دسته بندی جدید به لیست دسته بندی ها اضافه شود؟",
icon: 'info',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'بله، اضافه شود',
cancelButtonText: 'خیر'
}).then((result) => {
if (result.value) {
var Name = $("#Name").val();
var parentId = $("#parentId").val();
var postData = {
'Name': Name,
'parentId': parentId,
};
$.ajax({
contentType: 'application/x-www-form-urlencoded',
dataType: 'json',
type: "POST",
url: "AddNewCategory",
data: postData,
success: function (data) {
if (data.isSuccess == true) {
swal.fire(
'موفق!',
data.message,
'success'
).then(function (isConfirm) {
location.reload();
});
} else {
swal.fire(
'هشدار!',
data.message,
'warning'
);
}
},
error: function (request, status, error) {
swal.fire(
'هشدار!',
request.responseText,
'warning'
);
}
});
}
})
}
</script>
}
استفاده از SweetAlert2 برای نمایش پیامهای تایید و هشدار.
تابع AddNewCategory برای ارسال درخواست AJAX به سرور و اضافه کردن دستهبندی جدید.
بررسی صحت ورود اطلاعات و نمایش پیامهای مناسب بر اساس پاسخ سرور.
نتیجهگیری:
این کد به شما امکان میدهد تا یک صفحهی کاربرپسند برای اضافه کردن دستهبندی جدید به محصولات خود ایجاد کنید. از SweetAlert2 برای نمایش پیامهای تایید و هشدار استفاده میشود و درخواستهای AJAX برای ارسال دادهها به سرور استفاده میشوند.
EndPoint.Site => Areas => Admin => Controllers CategoriesController.cs
بیایید کد CategoriesController را بررسی کنیم. این کنترلر برای مدیریت عملیاتهای مربوط به دستهبندیها در قسمت مدیرت (Admin) استفاده میشود.
توضیحات کد:
Namespace و Imports:
csharp
using Microsoft.AspNetCore.Mvc;
using Test_Store.Application.Interfaces.FacadPatterns;
namespace EndPoint.Site.Areas.Admin.Controllers:
نامفضا برای سازماندهی کدهای مرتبط با کنترلرهای قسمت مدیریت.
using ها
برای ایمپورت کردن کلاسها و اینترفیسهای مورد نیاز.
تعریف کنترلر:
csharp
[Area("Admin")]
public class CategoriesController : Controller
{
private readonly IProductFacad _productFacad;
public CategoriesController(IProductFacad productFacad)
{
_productFacad = productFacad;
}
}
[Area("Admin")]:
مشخص میکند که این کنترلر متعلق به ناحیه (Area) "Admin" است.
private readonly IProductFacad _productFacad;:
تعریف یک فیلد خصوصی برای فاساد محصولات.
سازنده کنترلر که وابستگی به IProductFacad را از طریق تزریق وابستگی دریافت میکند.
متد Index:
csharp
public IActionResult Index(long? parentId)
{
return View(_productFacad.GetCategoriesService.Execute(parentId).Data);
}
این متد دادههای دستهبندیها را از سرویس GetCategoriesService میگیرد و به ویو ارسال میکند.
parentId
به عنوان پارامتر ورودی برای فیلتر کردن دستهبندیها استفاده میشود.
متد AddNewCategory (HttpGet):
csharp
[HttpGet]
public IActionResult AddNewCategory(long? parentId)
{
ViewBag.parentId = parentId;
return View();
}
این متد ویو AddNewCategory را نمایش میدهد و parentId را به ViewBag اختصاص میدهد تا در ویو استفاده شود.
متد AddNewCategory (HttpPost):
csharp
[HttpPost]
public IActionResult AddNewCategory(long? ParentId, string Name)
{
var result = _productFacad.AddNewCategoryService.Execute(ParentId, Name);
return Json(result);
}
این متد دادههای ارسال شده توسط کاربر را دریافت میکند و به سرویس AddNewCategoryService ارسال میکند.
سپس نتیجه را به صورت JSON بازمیگرداند.
نتیجهگیری:
این کنترلر CategoriesController به شما امکان میدهد تا عملیاتهای مربوط به مدیریت دستهبندیها را انجام دهید. شامل متدهای Index برای نمایش لیست دستهبندیها، AddNewCategory برای نمایش فرم اضافه کردن دستهبندی جدید (با متد GET) و پردازش فرم اضافه کردن دستهبندی جدید (با متد POST) است.
Test_Store 8.zip
حجم:
53.6M
افزودن محصولات جدید و لیست محصولات با جزئیات
بیایید کد IDataBaseContext را بررسی کنیم. این اینترفیس به منظور تعریف قراردادهای مورد نیاز برای ارتباط با دیتابیس در لایهی دادهای (Data Layer) استفاده میشود.
توضیحات کد:
تعریف اینترفیس:
csharp
public interface IDataBaseContext
{
// ...
}
این کد یک اینترفیس به نام IDataBaseContext تعریف میکند که شامل قراردادهای مورد نیاز برای کار با دیتابیس است.
DbSet ویژگیها:
این بخش شامل تعریف جداول مختلف دیتابیس به صورت DbSet است که نمایشی از جداول در دیتابیس را ارائه میدهد.
DbSet<T> کلاسهایی هستند که از طرف Entity Framework برای کار با جداول دیتابیس استفاده میشوند.
csharp
DbSet<User> Users { get; set; }
DbSet<Role> Roles { get; set; }
DbSet<UserInRole> UserInRoles { get; set; }
DbSet<Category> Categories { get; set; }
DbSet<Product> Products { get; set; }
DbSet<ProductImages> ProductImages { get; set; }
DbSet<ProductFeatures> ProductFeatures { get; set; }
هر یک از این DbSet ها به ترتیب برای کار با جداول User, Role, UserInRole, Category, Product, ProductImages, و ProductFeatures استفاده میشوند.
متدهای SaveChanges:
این بخش شامل تعریف متدهای مختلف برای ذخیره تغییرات در دیتابیس است.
csharp
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());
int SaveChanges(bool acceptAllChangesOnSuccess):
این متد تغییرات را در دیتابیس ذخیره میکند و پارامتر acceptAllChangesOnSuccess
تعیین میکند که آیا همه تغییرات در صورت موفقیت ذخیره شوند یا خیر.
int SaveChanges():
این متد تغییرات را در دیتابیس ذخیره میکند.
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken()):
این متد به صورت غیر همزمان (asynchronous) تغییرات را در دیتابیس ذخیره میکند.
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()):
این متد به صورت غیر همزمان تغییرات را در دیتابیس ذخیره میکند.
نتیجهگیری:
این اینترفیس IDataBaseContext به شما امکان میدهد تا جداول مختلف دیتابیس را تعریف کنید و متدهای مختلف برای ذخیره تغییرات در دیتابیس را ارائه میدهد. این طراحی کمک میکند تا ارتباط با دیتابیس به صورت انعطافپذیر و قابل تست باشد.
بیایید کد اینترفیس IProductFacad را بررسی کنیم. این اینترفیس به منظور تعریف قراردادهای مورد نیاز برای فاساد محصولات استفاده میشود. فاساد (Facade) یک الگوی طراحی است که یک رابط ساده و یکپارچه برای سیستمهای پیچیده ارائه میدهد.
توضیحات کد:
تعریف اینترفیس:
csharp
public interface IProductFacad
{
// ...
}
این کد یک اینترفیس به نام IProductFacad تعریف میکند که شامل قراردادهای مورد نیاز برای مدیریت محصولات است.
ویژگیها (Properties):
این بخش شامل تعریف ویژگیهای مختلف برای عملیاتهای مرتبط با محصولات است.
csharp
AddNewCategoryService AddNewCategoryService { get; }
IGetCategoriesService GetCategoriesService { get; }
AddNewProductService AddNewProductService { get; }
IGetAllCategoriesService GetAllCategoriesService { get; }
IGetProductForAdminService GetProductForAdminService { get; }
IGetProductDetailForAdminService GetProductDetailForAdminService { get; }
AddNewCategoryService:
این ویژگی یک شیء از نوع AddNewCategoryService را بازمیگرداند که برای اضافه کردن دستهبندی جدید استفاده میشود.
IGetCategoriesService:
این ویژگی یک شیء از نوع IGetCategoriesService را بازمیگرداند که برای دریافت دستهبندیها استفاده میشود.
AddNewProductService:
این ویژگی یک شیء از نوع AddNewProductService را بازمیگرداند که برای اضافه کردن محصول جدید استفاده میشود.
IGetAllCategoriesService:
این ویژگی یک شیء از نوع IGetAllCategoriesService را بازمیگرداند که برای دریافت همه دستهبندیها استفاده میشود.
IGetProductForAdminService:
این ویژگی یک شیء از نوع IGetProductForAdminService را بازمیگرداند که برای دریافت اطلاعات محصولات برای مدیران استفاده میشود.
IGetProductDetailForAdminService:
این ویژگی یک شیء از نوع IGetProductDetailForAdminService
را بازمیگرداند که برای دریافت جزئیات محصولات برای مدیران استفاده میشود.
نتیجهگیری:
این اینترفیس IProductFacad به شما امکان میدهد تا قراردادهای مختلف برای مدیریت محصولات را تعریف کنید. با استفاده از اینترفیس فاساد، میتوانید به صورت یکپارچه و ساده به عملیاتهای پیچیدهای مانند اضافه کردن دستهبندی و محصول، دریافت دستهبندیها و محصولات دسترسی داشته باشید.
بیایید کد کلاس ProductFacad را بررسی کنیم. این کلاس یک پیادهسازی از اینترفیس IProductFacad است و برای مدیریت عملیاتهای مختلف مرتبط با محصولات استفاده میشود.
توضیحات کد:
تعریف کلاس:
csharp
public class ProductFacad : IProductFacad
{
private readonly IDataBaseContext _context;
private readonly IHostingEnvironment _environment;
public ProductFacad(IDataBaseContext context, IHostingEnvironment hostingEnvironment)
{
_context = context;
_environment = hostingEnvironment;
}
}
این کلاس ProductFacad از اینترفیس IProductFacad پیادهسازی میکند.
دو فیلد خصوصی IDataBaseContext و IHostingEnvironment برای کار با دیتابیس و محیط میزبانی تعریف شدهاند.
سازنده کلاس این دو وابستگی را از طریق تزریق وابستگی دریافت میکند.
ویژگیها (Properties):
این بخش شامل تعریف ویژگیهای مختلف برای سرویسهای مرتبط با محصولات است.
AddNewCategoryService:
csharp
private AddNewCategoryService _addNewCategory;
public AddNewCategoryService AddNewCategoryService
{
get
{
return _addNewCategory = _addNewCategory ?? new AddNewCategoryService(_context);
}
}
این ویژگی یک نمونه از AddNewCategoryService را بازمیگرداند. اگر نمونه قبلاً ایجاد نشده باشد، آن را ایجاد میکند.
IGetCategoriesService:
csharp
private IGetCategoriesService _getCategoriesService;
public IGetCategoriesService GetCategoriesService
{
get
{
return _getCategoriesService = _getCategoriesService ?? new GetCategoriesService(_context);
}
}
این ویژگی یک نمونه از IGetCategoriesService را بازمیگرداند. اگر نمونه قبلاً ایجاد نشده باشد، آن را ایجاد میکند.
AddNewProductService:
csharp
private AddNewProductService _addNewProductService;
public AddNewProductService AddNewProductService
{
get
{
return _addNewProductService = _addNewProductService ?? new AddNewProductService(_context, _environment);
}
}
این ویژگی یک نمونه از AddNewProductService را بازمیگرداند. اگر نمونه قبلاً ایجاد نشده باشد، آن را ایجاد میکند.
IGetAllCategoriesService:
csharp
private IGetAllCategoriesService _getAllCategoriesService;
public IGetAllCategoriesService GetAllCategoriesService
{
get
{
return _getAllCategoriesService = _getAllCategoriesService ?? new GetAllCategoriesService(_context);
}
}
این ویژگی یک نمونه از IGetAllCategoriesService را بازمیگرداند. اگر نمونه قبلاً ایجاد نشده باشد، آن را ایجاد میکند.
IGetProductForAdminService:
csharp
private IGetProductForAdminService _getProductForAdminService;
public IGetProductForAdminService GetProductForAdminService
{
get
{
return _getProductForAdminService = _getProductForAdminService ?? new GetProductForAdminService(_context);
}
}
این ویژگی یک نمونه از IGetProductForAdminService را بازمیگرداند. اگر نمونه قبلاً ایجاد نشده باشد، آن را ایجاد میکند.
IGetProductDetailForAdminService:
csharp
private IGetProductDetailForAdminService _getProductDetailForAdminService;
public IGetProductDetailForAdminService GetProductDetailForAdminService
{
get
{
return _getProductDetailForAdminService = _getProductDetailForAdminService ?? new GetProductDetailForAdminService(_context);
}
}
این ویژگی یک نمونه از IGetProductDetailForAdminService را بازمیگرداند. اگر نمونه قبلاً ایجاد نشده باشد، آن را ایجاد میکند.
نتیجهگیری:
این کلاس ProductFacad به عنوان یک فاساد برای مدیریت عملیاتهای مختلف مرتبط با محصولات عمل میکند. با استفاده از ویژگیهای مختلف، این کلاس سرویسهای مختلف مانند اضافه کردن دستهبندی، دریافت دستهبندیها، اضافه کردن محصول و دریافت اطلاعات محصولات را ارائه میدهد. این طراحی کمک میکند تا عملیاتهای پیچیده به صورت سادهتر و یکپارچهتر مدیریت شوند.
بیایید این کد را که برای دریافت جزئیات محصول برای مدیران (ادمینها) استفاده میشود بررسی کنیم. این کد شامل تعریف اینترفیس IGetProductDetailForAdminService و پیادهسازی آن در کلاس GetProductDetailForAdminService است.
توضیحات کد:
تعریف اینترفیس:
csharp
public interface IGetProductDetailForAdminService
{
ResultDto<ProductDetailForAdmindto> Execute(long Id);
}
این اینترفیس یک متد Execute تعریف میکند که یک long به عنوان ورودی میگیرد و یک ResultDto<ProductDetailForAdmindto> را بازمیگرداند.
کلاس GetProductDetailForAdminService:
فیلدهای خصوصی و سازنده:
csharp
public class GetProductDetailForAdminService : IGetProductDetailForAdminService
{
private readonly IDataBaseContext _context;
public GetProductDetailForAdminService(IDataBaseContext context)
{
_context = context;
}
}
این کلاس شامل یک فیلد خصوصی _context از نوع IDataBaseContext و یک سازنده است که این فیلد را مقداردهی اولیه میکند.
متد Execute:
csharp
public ResultDto<ProductDetailForAdmindto> Execute(long Id)
{
var product = _context.Products
.Include(p => p.Category)
.ThenInclude(p => p.ParentCategory)
.Include(p => p.ProductFeatures)
.Include(p => p.ProductImages)
.Where(p => p.Id == Id)
.FirstOrDefault();
return new ResultDto<ProductDetailForAdmindto>()
{
Data = new ProductDetailForAdmindto()
{
Brand = product.Brand,
Category = GetCategory(product.Category),
Description = product.Description,
Displayed = product.Displayed,
Id = product.Id,
Inventory = product.Inventory,
Name = product.Name,
Price = product.Price,
Features = product.ProductFeatures.Select(p => new ProductDetailFeatureDto
{
Id = p.Id,
DisplayName = p.DisplayName,
Value = p.Value
}).ToList(),
Images = product.ProductImages.Select(p => new ProductDetailImagesDto
{
Id = p.Id,
Src = p.Src,
}).ToList(),
},
IsSuccess = true,
Message = "",
};
}
این متد اطلاعات محصول را با استفاده از شناسه محصول Id از دیتابیس دریافت میکند.
از Include و ThenInclude برای بارگذاری اطلاعات مرتبط استفاده میشود (مثلاً دستهبندیها، ویژگیهای محصول، تصاویر محصول).
نتیجه به عنوان یک ResultDto<ProductDetailForAdmindto> بازگردانده میشود که شامل جزئیات محصول است.
متد کمکی GetCategory:
csharp
private string GetCategory(Category category)
{
string result = category.ParentCategory != null ? $"{category.ParentCategory.Name} - " : "";
return result += category.Name;
}
این متد برای دریافت نام دستهبندی و والد آن (در صورت وجود) استفاده میشود.
کلاسهای دادهای:
ProductDetailForAdmindto:
csharp
public class ProductDetailForAdmindto
{
public long Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public string Brand { get; set; }
public string Description { get; set; }
public int Price { get; set; }
public int Inventory { get; set; }
public bool Displayed { get; set; }
public List<ProductDetailFeatureDto> Features { get; set; }
public List<ProductDetailImagesDto> Images { get; set; }
}
این کلاس شامل جزئیات محصول مانند شناسه، نام، دستهبندی، برند، توضیحات، قیمت، موجودی، ویژگیها و تصاویر محصول است.
ProductDetailImagesDto:
csharp
public class ProductDetailImagesDto
{
public long Id { get; set; }
public string Src { get; set; }
}
این کلاس شامل اطلاعات تصاویر محصول است.
ProductDetailFeatureDto:
csharp
public class ProductDetailFeatureDto
{
public long Id { get; set; }
public string DisplayName { get; set; }
public string Value { get; set; }
}
این کلاس شامل اطلاعات ویژگیهای محصول است.
نتیجهگیری:
این کد به شما امکان میدهد تا جزئیات کامل یک محصول را با استفاده از شناسه آن دریافت کنید. از اینترفیس IGetProductDetailForAdminService برای تعریف قرارداد و از کلاس GetProductDetailForAdminService برای پیادهسازی این قرارداد استفاده میشود. جزئیات محصول شامل ویژگیها، تصاویر، دستهبندی، و سایر اطلاعات مرتبط است که به مدیران کمک میکند تا اطلاعات کامل و دقیقی از محصولات داشته باشند.
بیایید کد سرویس GetProductForAdminService و اینترفیس IGetProductForAdminService را که برای دریافت محصولات برای مدیران استفاده میشود بررسی کنیم.
توضیحات کد:
تعریف اینترفیس:
csharp
public interface IGetProductForAdminService
{
ResultDto<ProductForAdminDto> Execute(int Page = 1, int PageSize = 20);
}
این اینترفیس یک متد Execute تعریف میکند که دو پارامتر Page و PageSize دریافت میکند و یک ResultDto<ProductForAdminDto> را بازمیگرداند.
پارامتر Page نشاندهنده شماره صفحه و PageSize نشاندهنده تعداد آیتمها در هر صفحه است.
کلاس GetProductForAdminService:
فیلدهای خصوصی و سازنده:
csharp
public class GetProductForAdminService : IGetProductForAdminService
{
private readonly IDataBaseContext _context;
public GetProductForAdminService(IDataBaseContext context)
{
_context = context;
}
}
این کلاس شامل یک فیلد خصوصی _context از نوع IDataBaseContext و یک سازنده است که این فیلد را مقداردهی اولیه میکند.
متد Execute:
csharp
public ResultDto<ProductForAdminDto> Execute(int Page = 1, int PageSize = 20)
{
int rowCount = 0;
var products = _context.Products
.Include(p => p.Category)
.ToPaged(Page, PageSize, out rowCount)
.Select(p => new ProductsFormAdminList_Dto
{
Id = p.Id,
Brand = p.Brand,
Category = p.Category.Name,
Description = p.Description,
Displayed = p.Displayed,
Inventory = p.Inventory,
Name = p.Name,
Price = p.Price,
}).ToList();
return new ResultDto<ProductForAdminDto>()
{
Data = new ProductForAdminDto()
{
Products = products,
CurrentPage = Page,
PageSize = PageSize,
RowCount = rowCount
},
IsSuccess = true,
Message = "",
};
}
این متد اطلاعات محصولات را از دیتابیس دریافت میکند و سپس آنها را به صورت صفحهبندی شده (paging) بازمیگرداند.
از Include برای بارگذاری اطلاعات مرتبط (دستهبندی) استفاده میشود.
متد ToPaged برای انجام عملیات صفحهبندی استفاده میشود و rowCount تعداد کل رکوردها را محاسبه میکند.
نتیجه به عنوان یک ResultDto<ProductForAdminDto> شامل محصولات صفحهبندی شده، شماره صفحه جاری، اندازه صفحه و تعداد کل رکوردها بازگردانده میشود.
کلاسهای دادهای:
ProductForAdminDto:
csharp
public class ProductForAdminDto
{
public int RowCount { get; set; }
public int CurrentPage { get; set; }
public int PageSize { get; set; }
public List<ProductsFormAdminList_Dto> Products { get; set; }
}
این کلاس شامل جزئیات مربوط به صفحهبندی مانند تعداد کل رکوردها، شماره صفحه جاری، اندازه صفحه و لیست محصولات است.
ProductsFormAdminList_Dto:
csharp
public class ProductsFormAdminList_Dto
{
public long Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public string Brand { get; set; }
public string Description { get; set; }
public int Price { get; set; }
public int Inventory { get; set; }
public bool Displayed { get; set; }
}
این کلاس شامل اطلاعات محصول مانند شناسه، نام، دستهبندی، برند، توضیحات، قیمت، موجودی و وضعیت نمایش است.
نتیجهگیری:
این کد به شما امکان میدهد تا لیست محصولات را به صورت صفحهبندی شده برای مدیران دریافت کنید. از اینترفیس IGetProductForAdminService برای تعریف قرارداد و از کلاس GetProductForAdminService برای پیادهسازی این قرارداد استفاده میشود. اطلاعات محصولات شامل جزئیات صفحهبندی و محصولات بازگردانده شده است که به مدیران کمک میکند تا به راحتی محصولات را مدیریت کنند.