eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
120 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
بیایید کد 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 برای پیاده‌سازی این قرارداد استفاده می‌شود. اطلاعات محصولات شامل جزئیات صفحه‌بندی و محصولات بازگردانده شده است که به مدیران کمک می‌کند تا به راحتی محصولات را مدیریت کنند.
بیایید کد کلاس Category را بررسی کنیم. این کلاس نمایانگر یک دسته‌بندی در سیستم است و از کلاس پایه BaseEntity ارث‌بری می‌کند. توضیحات کد: تعریف کلاس: csharp public class Category : BaseEntity { // ... } این کد یک کلاس به نام Category تعریف می‌کند که از کلاس پایه BaseEntity ارث‌بری می‌کند. کلاس BaseEntity معمولاً شامل ویژگی‌های عمومی مانند Id, CreatedDate, ModifiedDate و غیره است. ویژگی‌ها (Properties): Name: csharp public string Name { get; set; } این ویژگی نام دسته‌بندی را نگه می‌دارد. ParentCategory و ParentCategoryId: csharp public virtual Category ParentCategory { get; set; } public long? ParentCategoryId { get; set; } ParentCategory: این ویژگی یک دسته‌بندی والد (پدر) را نگه می‌دارد. ParentCategoryId: این ویژگی شناسه دسته‌بندی والد را نگه می‌دارد. استفاده از virtual به دلیل استفاده از قابلیت Lazy Loading در Entity Framework است. SubCategories: csharp public virtual ICollection<Category> SubCategories { get; set; } این ویژگی یک مجموعه از دسته‌بندی‌های فرزند (زیر دسته‌ها) را نگه می‌دارد. ICollection<Category> برای نگهداری و مدیریت لیستی از دسته‌بندی‌های فرزند استفاده می‌شود. این ویژگی از نوع virtual است که به Entity Framework اجازه می‌دهد تا روابط Lazy Load را پیاده‌سازی کند. نتیجه‌گیری: این کلاس Category به شما امکان می‌دهد تا دسته‌بندی‌ها را در سیستم مدیریت کنید. شامل نام دسته‌بندی، دسته‌بندی والد (پدر) و زیر دسته‌ها است. این ساختار به شما اجازه می‌دهد تا دسته‌بندی‌ها را به صورت سلسله‌مراتبی (درختی) سازماندهی کنید. از ویژگی‌های virtual برای استفاده از قابلیت Lazy Loading در Entity Framework استفاده شده است.
بیایید کد کلاس Product را که نمایانگر یک محصول در سیستم است بررسی کنیم. این کلاس از کلاس پایه BaseEntity ارث‌بری می‌کند. توضیحات کد: تعریف کلاس: csharp public class Product : BaseEntity { // ... } این کد یک کلاس به نام Product تعریف می‌کند که از کلاس پایه BaseEntity ارث‌بری می‌کند. کلاس BaseEntity معمولاً شامل ویژگی‌های عمومی مانند Id, CreatedDate, ModifiedDate و غیره است. ویژگی‌ها (Properties): Name: csharp public string Name { get; set; } این ویژگی نام محصول را نگه می‌دارد. Brand: csharp public string Brand { get; set; } این ویژگی برند محصول را نگه می‌دارد. Description: csharp public string Description { get; set; } این ویژگی توضیحات محصول را نگه می‌دارد. Price: csharp public int Price { get; set; } این ویژگی قیمت محصول را نگه می‌دارد. Inventory: csharp public int Inventory { get; set; } این ویژگی موجودی (تعداد موجود) محصول را نگه می‌دارد. Displayed: csharp public bool Displayed { get; set; } این ویژگی نشان می‌دهد که آیا محصول در سایت نمایش داده می‌شود یا خیر. روابط (Relationships): Category و CategoryId: csharp public virtual Category Category { get; set; } public long CategoryId { get; set; } Category: این ویژگی نمایانگر دسته‌بندی محصول است و به صورت virtual تعریف شده تا Entity Framework بتواند از قابلیت Lazy Loading استفاده کند. CategoryId: این ویژگی شناسه دسته‌بندی محصول را نگه می‌دارد. ProductImages: csharp public virtual ICollection<ProductImages> ProductImages { get; set; } این ویژگی یک مجموعه از تصاویر محصول را نگه می‌دارد. استفاده از ICollection<ProductImages> برای مدیریت لیستی از تصاویر محصول. این ویژگی از نوع virtual است که به Entity Framework اجازه می‌دهد تا روابط Lazy Load را پیاده‌سازی کند. ProductFeatures: csharp public virtual ICollection<ProductFeatures> ProductFeatures { get; set; } این ویژگی یک مجموعه از ویژگی‌های محصول را نگه می‌دارد. استفاده از ICollection<ProductFeatures> برای مدیریت لیستی از ویژگی‌های محصول. این ویژگی از نوع virtual است که به Entity Framework اجازه می‌دهد تا روابط Lazy Load را پیاده‌سازی کند. نتیجه‌گیری: کلاس Product به شما امکان می‌دهد تا محصولات را در سیستم مدیریت کنید. شامل ویژگی‌هایی مانند نام، برند، توضیحات، قیمت، موجودی و وضعیت نمایش است. همچنین روابط با دسته‌بندی، تصاویر محصول و ویژگی‌های محصول را مدیریت می‌کند. این ساختار کمک می‌کند تا اطلاعات محصول به صورت کامل و سازمان‌یافته ذخیره و بازیابی شوند.
بیایید کد کلاس ProductFeatures را بررسی کنیم. این کلاس برای نگهداری ویژگی‌های محصولات استفاده می‌شود و از کلاس پایه BaseEntity ارث‌بری می‌کند. توضیحات کد: تعریف کلاس: csharp public class ProductFeatures : BaseEntity { // ... } این کد یک کلاس به نام ProductFeatures تعریف می‌کند که از کلاس پایه BaseEntity ارث‌بری می‌کند. کلاس BaseEntity معمولاً شامل ویژگی‌های عمومی مانند Id, CreatedDate, ModifiedDate و غیره است. ویژگی‌ها (Properties): Product و ProductId: csharp public virtual Product Product { get; set; } public long ProductId { get; set; } Product: این ویژگی یک شیء از نوع Product را نگه می‌دارد که نمایانگر محصولی است که این ویژگی به آن تعلق دارد. استفاده از virtual به دلیل استفاده از قابلیت Lazy Loading در Entity Framework است. ProductId: این ویژگی شناسه محصولی را نگه می‌دارد که این ویژگی به آن تعلق دارد. DisplayName: csharp public string DisplayName { get; set; } این ویژگی نام نمایشی ویژگی محصول را نگه می‌دارد. برای مثال، اگر ویژگی "رنگ" باشد، مقدار DisplayName ممکن است "Color" باشد. Value: csharp public string Value { get; set; } این ویژگی مقدار ویژگی محصول را نگه می‌دارد. برای مثال، اگر ویژگی "رنگ" باشد، مقدار Value ممکن است "قرمز" باشد. نتیجه‌گیری: کلاس ProductFeatures به شما امکان می‌دهد تا ویژگی‌های محصولات را مدیریت کنید. این شامل نام نمایشی ویژگی و مقدار آن می‌شود. همچنین، این کلاس روابطی با کلاس Product دارد که نمایانگر محصولی است که این ویژگی به آن تعلق دارد. با این ساختار، می‌توانید اطلاعات ویژگی‌های محصول را به صورت سازمان‌یافته و کاملاً مرتبط با محصولات خود ذخیره و مدیریت کنید.
بیایید کد کلاس ProductImages را بررسی کنیم. این کلاس برای نگهداری تصاویر محصولات استفاده می‌شود و از کلاس پایه BaseEntity ارث‌بری می‌کند. توضیحات کد: تعریف کلاس: csharp public class ProductImages : BaseEntity { // ... } این کد یک کلاس به نام ProductImages تعریف می‌کند که از کلاس پایه BaseEntity ارث‌بری می‌کند. کلاس BaseEntity معمولاً شامل ویژگی‌های عمومی مانند Id, CreatedDate, ModifiedDate و غیره است. ویژگی‌ها (Properties): Product و ProductId: csharp public virtual Product Product { get; set; } public long ProductId { get; set; } Product: این ویژگی یک شیء از نوع Product را نگه می‌دارد که نمایانگر محصولی است که این تصویر به آن تعلق دارد. استفاده از virtual به دلیل استفاده از قابلیت Lazy Loading در Entity Framework است. ProductId: این ویژگی شناسه محصولی را نگه می‌دارد که این تصویر به آن تعلق دارد. Src: csharp public string Src { get; set; } این ویژگی مسیر یا لینک تصویر محصول را نگه می‌دارد. برای مثال، می‌تواند مسیری به یک فایل تصویر در سرور یا یک لینک به تصویر در اینترنت باشد. نتیجه‌گیری: کلاس ProductImages به شما امکان می‌دهد تا تصاویر مرتبط با محصولات را مدیریت کنید. این شامل مسیر یا لینک تصویر و شناسه محصول مربوطه است. همچنین، این کلاس روابطی با کلاس Product دارد که نمایانگر محصولی است که این تصویر به آن تعلق دارد. با این ساختار، می‌توانید اطلاعات تصاویر محصولات را به صورت سازمان‌یافته و کاملاً مرتبط با محصولات خود ذخیره و مدیریت کنید.
بیایید کد کنترلر ProductsController را که برای مدیریت عملیات‌های مرتبط با محصولات در بخش مدیرت استفاده می‌شود بررسی کنیم. توضیحات کد: تعریف نام‌فضا و وارد کردن وابستگی‌ها: csharp namespace EndPoint.Site.Areas.Admin.Controllers { [Area("Admin")] public class ProductsController : Controller { private readonly IProductFacad _productFacad; public ProductsController(IProductFacad productFacad) { _productFacad = productFacad; } } } namespace: EndPoint.Site.Areas.Admin.Controllers نام‌فضا را مشخص می‌کند. [Area("Admin")]: مشخص می‌کند که این کنترلر متعلق به ناحیه (Area) "Admin" است. ProductsController: کنترلری برای مدیریت عملیات‌های محصولات تعریف می‌کند. IProductFacad: یک فیلد خصوصی _productFacad از نوع فاساد محصولات تعریف می‌کند و آن را از طریق سازنده کنترلر مقداردهی اولیه می‌کند. متد Index: csharp public IActionResult Index(int Page = 1, int PageSize = 20) { return View(_productFacad.GetProductForAdminService.Execute(Page, PageSize).Data); } این متد صفحه اصلی محصولات را نمایش می‌دهد. از متد Execute سرویس GetProductForAdminService برای دریافت لیست محصولات صفحه‌بندی شده استفاده می‌کند و نتیجه را به ویو ارسال می‌کند. متد Detail: csharp public IActionResult Detail(long Id) { return View(_productFacad.GetProductDetailForAdminService.Execute(Id).Data); } این متد جزئیات یک محصول خاص را نمایش می‌دهد. از متد Execute سرویس GetProductDetailForAdminService برای دریافت جزئیات محصول با استفاده از شناسه Id استفاده می‌کند و نتیجه را به ویو ارسال می‌کند. متد AddNewProduct (HttpGet): csharp [HttpGet] public IActionResult AddNewProduct() { ViewBag.Categories = new SelectList(_productFacad.GetAllCategoriesService.Execute().Data, "Id", "Name"); return View(); } این متد فرم اضافه کردن محصول جدید را نمایش می‌دهد. از سرویس GetAllCategoriesService برای دریافت لیست همه دسته‌بندی‌ها استفاده می‌کند و آن را به ViewBag.Categories اختصاص می‌دهد تا در فرم استفاده شود. متد AddNewProduct (HttpPost): csharp [HttpPost] public IActionResult AddNewProduct(RequestAddNewProductDto request, List<AddNewProduct_Features> Features) { List<IFormFile> images = new List<IFormFile>(); for (int i = 0; i < Request.Form.Files.Count; i++) { var file = Request.Form.Files[i]; images.Add(file); } request.Images = images; request.Features = Features; return Json(_productFacad.AddNewProductService.Execute(request)); } این متد داده‌های فرم ارسال شده برای اضافه کردن محصول جدید را پردازش می‌کند. فایل‌های آپلود شده (تصاویر محصول) را از فرم دریافت می‌کند و به لیست images اضافه می‌کند. ویژگی‌های محصول را از ورودی دریافت می‌کند و به request اختصاص می‌دهد. از سرویس AddNewProductService برای افزودن محصول جدید استفاده می‌کند و نتیجه را به صورت JSON بازمی‌گرداند. نتیجه‌گیری: کنترلر ProductsController به شما امکان می‌دهد تا عملیات‌های مرتبط با مدیریت محصولات را انجام دهید. شامل متدهایی برای نمایش لیست محصولات، نمایش جزئیات محصول، نمایش فرم اضافه کردن محصول جدید و پردازش داده‌های فرم برای اضافه کردن محصول جدید است. این طراحی به مدیران کمک می‌کند تا به راحتی محصولات را مدیریت کنند و اطلاعات کامل و دقیقی از محصولات داشته باشند.
بیایید این کد را که برای نمایش فرم افزودن محصول جدید در بخش مدیریت استفاده می‌شود بررسی کنیم. توضیحات کد: اضافه کردن Tag Helpers: csharp @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers این خط کد Tag Helpers مربوط به ASP.NET Core MVC را به ویو اضافه می‌کند تا بتوان از تگ‌های HTML کمکی در ویو استفاده کرد. ViewData و Layout: csharp @{ ViewData["Title"] = "AddNewProduct"; Layout = "~/Areas/Admin/Views/Shared/_Adminlayout.cshtml"; } ViewData["Title"]: عنوان صفحه را به "AddNewProduct" تنظیم می‌کند. Layout: از Layout مشخص شده برای این صفحه استفاده می‌کند. بخش اصلی HTML: بخش‌های مختلف صفحه شامل هدر، بدنه، و فرم برای افزودن محصول جدید. فرم افزودن محصول جدید: html <section class="basic-elements"> <div class="row"> <div class="col-sm-12"> <h2 class="content-header">فرم ثبت نام کاربر جدید</h2> </div> </div> <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"> <label for="basicInput">نام محصول </label> <input type="text" class="form-control" id="Name"> </fieldset> </div> <div class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <label for="basicInput"> برند </label> <input type="text" class="form-control" id="Brand"> </fieldset> </div> <div class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <label for="basicInput"> قیمت</label> <input type="number" class="form-control" id="Price"> </fieldset> </div> <div class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <label for="basicInput"> تعداد موجودی</label> <input type="number" class="form-control" id="Inventory"> </fieldset> </div> <div class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <label for="basicInput">نمایش داده شود؟ </label> <input type="checkbox" class="form-control" id="Displayed"> </fieldset> </div> <div class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <label for="basicInput">تصاویر </label> <input type="file" multiple class="form-control" accept="image/*" id="Images"> </fieldset> </div>