Program.cs
افزودن سرویسها به کانتینر
csharp
// Add services to the container.
این خط نظر (comment) است و برای توضیح اینکه بخش بعدی کد سرویسها را به کانتینر DI (Dependency Injection) اضافه میکند، استفاده میشود.
افزودن Scoped Service
csharp
builder.Services.AddScoped<IDataBaseContext, DataBaseContext>();
builder.Services.AddScoped<IDataBaseContext, DataBaseContext>();:
این خط به DI Container میگوید که هر بار که به IDataBaseContext نیاز داریم، یک نمونه جدید از DataBaseContext ایجاد کند. "Scoped" به این معنی است که یک نمونه جدید برای هر درخواست HTTP ساخته میشود.
تنظیمات اتصال به پایگاه داده
csharp
string connectionString = @"Server=.\SQLEXPRESS; Database=Test_StoreDb; Integrated Security=True; TrustServerCertificate=True;";
string connectionString = @"Server=.\SQLEXPRESS; Database=Test_StoreDb; Integrated Security=True; TrustServerCertificate=True;";:
این خط یک رشته اتصال (connection string) را تعریف میکند که برای اتصال به پایگاه داده SQL Server استفاده میشود. این رشته اتصال شامل اطلاعات سرور، نام دیتابیس و تنظیمات امنیتی است.
پیکربندی DbContext
csharp
builder.Services.AddDbContext<DataBaseContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDbContext<DataBaseContext>(options => options.UseSqlServer(connectionString));:
این خط به DI Container میگوید که از DbContext با استفاده از تنظیمات SQL Server و رشته اتصال دادهشده (connectionString) استفاده کند. UseSqlServer مشخص میکند که از SQL Server به عنوان دیتابیس استفاده شود.
افزودن سرویسهای MVC
csharp
builder.Services.AddControllersWithViews();
builder.Services.AddControllersWithViews();:
این خط به DI Container میگوید که سرویسهای MVC را با پشتیبانی از کنترلرها و نماها اضافه کند. این سرویسها برای ایجاد و مدیریت درخواستها و پاسخها در برنامه ASP.NET Core استفاده میشوند.
نتیجهگیری
این بخش از کد، سرویسهای مورد نیاز برای تعامل با پایگاه داده و پشتیبانی از MVC را به کانتینر DI اضافه میکند. با این تنظیمات، برنامه شما قادر خواهد بود تا به پایگاه داده متصل شود و از کنترلرها و نماها برای مدیریت درخواستها و پاسخها استفاده کند.
در packing manager console عبارت Add-Migration users و بعد Update-Database وارد کنید
Test_Store 5.zip
حجم:
42.9M
پروژه قسمت دوم Users
در این بخش
Common:
فایل Pagination.cs
پوشه Dto
فایل ResultDto.cs
پوشه Roles
فایل UserRoles.cs
و
Application:
پوشه های Services و Users و Commands و RegisterUser
فایل IRegisterUserService.cs
و
پوشه های Services و Users و Queries و GetRoles
فایل ها
GetRolesService.cs
IGetRolesService.cs
RolesDto.cs
و
پوشه های Services و Users و Queries و GetUsers
فایل ها
GetUsersDto.cs
GetUsersService.cs
IGetUsersService.cs
RequestGetUserDto.cs
ReslutGetUserDto.cs
اضافه شدند
ساختار درختی پوشه و فایل
Test_Store
│
├── Doc
│
├── Src
│ ├── Common
│ │ └── library: Test_Store.Common
│ │ ├── Dto
│ │ │ └── ResultDto.cs
│ │ ├── Roles
│ │ │ └── UserRoles.cs
│ │ └── Pagination.cs
│ │
│ ├──── Core
│ │ ├──── library: Test_Store.Application
│ │ │ ├── Interfaces
│ │ │ │ └── Contexs
│ │ │ │ └── IDataBaseCotex.cs
│ │ │ └── Services
│ │ │ └── Users
│ │ │ ├── Commands
│ │ │ │ └── RegisterUser
│ │ │ │ └── IRegisterUserService.cs
│ │ │ └── Queries
│ │ │ ├── GetRoles
│ │ │ │ ├── GetRolesService.cs
│ │ │ │ ├── IGetRolesService.cs
│ │ │ │ └── RolesDto.cs
│ │ │ └── GetUsers
│ │ │ ├── GetUsersDto.cs
│ │ │ ├── GetUsersService.cs
│ │ │ ├── IGetUsersService.cs
│ │ │ ├── RequestGetUserDto.cs
│ │ │ └── ReslutGetUserDto.cs
│ │ │
│ │ └── library: Test_Store.Domain
│ │ └── Entities
│ │ └── Users
│ │ ├── Role.cs
│ │ ├── User.cs
│ │ └── UserInRole.cs
│ │
│ ├── Infrastructure
│ │ ├── library: Test_Store.Infrastructure
│ │ └── library: Test_Store.Persistence
│ │ ├── Context
│ │ │ └── DataBaseContext.cs
│ │ └── Migrations
│ │ ├── ......_Users.cs
│ │ └── DataBaseContextModelSnapshot.cs
│ │
│ └── Presentation
│ └── ASP.NET Core: EndPoint.Site
│ │
│ ├── Areas
│ │ └── Admin
│ │ ├── Controllers
│ │ │ └── UsersController.cs
│ │ ├── Views
│ │ │ ├── Shared
│ │ │ │ └── _AdminLayout.cshtml
│ │ │ └── Users
│ │ │ ├── Create.cshtml
│ │ │ └── Index.cshtml
│ │ └── Models
│ ├── Controllers
│ │ └── HomeController.cs
│ ├── Views
│ │ ├── Home
│ │ │ ├── Index.cshtml
│ │ │ └── Privacy.cshtml
│ │ ├── Shared
│ │ │ ├── _Layout.cshtml
│ │ │ ├── _ValidationScriptsPartial.cshtml
│ │ │ └── Error.cshtml
│ │ ├── _ViewImports.cshtml
│ │ └── _ViewStart.cshtml
│ ├── Models
│ │ └── ErrorViewModel.cs
│ ├── wwwroot
│ │ ├── AdminTemplate
│ │ ├── css
│ │ ├── js
│ │ ├── lib
│ │ ├── SiteTemplate
│ │ └── favicon.ico
│ └── Program.cs
│
└── Test
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
این دستور یک دستور Razor است که در فایلهای Razor (مانند .cshtml) استفاده میشود تا Tag Helperهای خاص ASP.NET Core MVC را به نماهای شما اضافه کند.
توضیحات اجزای دستور
@addTagHelper:
این دستور به Razor میگوید که Tag Helperهایی که در برنامه استفاده میکنید را ثبت کند. Tag Helperها به شما امکان میدهند که HTML کدهای سرور را با استفاده از سینتکس HTML راحتتر بنویسید و مدیریت کنید.
*: این کاراکتر به عنوان یک ویلدکارت عمل میکند و به معنای همه Tag Helperها است. به عبارت دیگر، همه Tag Helperهایی که در اسمبلی مشخصشده (در اینجا Microsoft.AspNetCore.Mvc.TagHelpers) تعریف شدهاند را شامل میشود.
Microsoft.AspNetCore.Mvc.TagHelpers:
این نام اسمبلی (assembly) یا کتابخانهای است که Tag Helperها در آن تعریف شدهاند. در اینجا، Tag Helperهای پیشفرض ASP.NET Core MVC هستند که برای کمک به مدیریت فرمها، پیوندها، و سایر عناصر HTML استفاده میشوند.
نتیجهگیری
با اضافه کردن این دستور به نماهای Razor خود، میتوانید از Tag Helperهای ASP.NET Core MVC بهرهمند شوید. این Tag Helperها به شما امکان میدهند که با استفاده از سینتکس HTML راحتتر و قویتری، کدهای سرور را بنویسید. برای مثال، Tag Helperهایی مانند asp-for، asp-controller و asp-action که برای تولید فرمها و لینکها استفاده میشوند.
توضیح کد
html
<div class="form-group">
<label>انتخاب کنید</label>
<select class="form-control" id="Role" name="Role" asp-items="@ViewBag.Roles">
</select>
</div>
توضیحات اجزای کد
<div class="form-group">:
این تگ div برای گروهبندی المانهای فرم استفاده میشود. کلاس form-group از Bootstrap برای اعمال استایلهای پیشفرض استفاده میشود.
<label>انتخاب کنید</label>:
این تگ label برای نمایش یک برچسب (Label) به کاربر استفاده میشود. متن داخل آن "انتخاب کنید" است که به کاربر نشان میدهد باید گزینهای را انتخاب کند.
<select class="form-control" id="Role" name="Role" asp-items="@ViewBag.Roles">:
این تگ select برای ایجاد یک لیست کشویی (Dropdown) استفاده میشود.
class="form-control":
این کلاس از Bootstrap برای اعمال استایلهای پیشفرض به لیست کشویی استفاده میشود.
id="Role":
این شناسه (ID) یکتا برای این المان است که میتواند در جاوااسکریپت یا استایلها استفاده شود.
name="Role":
این نام (Name) که برای ارسال دادههای این المان به سرور استفاده میشود.
asp-items="@ViewBag.Roles":
این ویژگی از ASP.NET Core Tag Helpers استفاده میکند تا آیتمهای لیست کشویی را با استفاده از ViewBag.Roles پر کند. ViewBag.Roles باید در کنترلر تنظیم شود و یک مجموعه از گزینههای موجود را برای لیست کشویی فراهم کند.
مثال استفاده از ViewBag در کنترلر
برای اینکه asp-items به درستی کار کند، باید در کنترلر خود ViewBag.Roles را تنظیم کنید. به عنوان مثال:
csharp
public IActionResult Create()
{
ViewBag.Roles = new SelectList(new List<string> { "Admin", "User", "Guest" });
return View();
}
در این مثال، ViewBag.Roles یک SelectList از سه نقش مختلف (Admin, User, Guest) ایجاد میکند و آن را به نما ارسال میکند تا آیتمهای لیست کشویی را پر کند.
نتیجهگیری
این کد یک لیست کشویی را در یک فرم HTML ایجاد میکند که با استفاده از دادههای موجود در ViewBag.Roles پر میشود. استایلهای Bootstrap به کار گرفته شدهاند تا فرم و لیست کشویی ظاهری مرتب و استاندارد داشته باشند.
Test_Store.Common => Dto => ResultDto.cs
توضیح کلی
این کد دو کلاس ResultDto و ResultDto<T> را در یک نامفضا (namespace) به نام Test_Store.Common.Dto تعریف میکند. این کلاسها برای انتقال دادهها به عنوان نتیجه عملیات مختلف استفاده میشوند.
تعریف نامفضا
csharp
namespace Test_Store.Common.Dto
این بخش، نامفضا (namespace) را تعریف میکند که این کلاسها در آن قرار دارند. نامفضاها برای سازماندهی و دستهبندی کدها استفاده میشوند.
کلاس ResultDto
csharp
public class ResultDto
{
public bool IsSuccess { get; set; }
public string Massage { get; set; }
}
public bool IsSuccess { get; set; }:
این پراپرتی نشاندهنده موفقیت یا عدم موفقیت یک عملیات است. اگر مقدار آن true باشد، عملیات موفق بوده است، و اگر false باشد، عملیات با شکست مواجه شده است.
public string Massage { get; set; }: این پراپرتی پیامی (Message) را که مربوط به نتیجه عملیات است، ذخیره میکند. به عنوان مثال، ممکن است پیام موفقیت یا خطا باشد.
کلاس جنریک ResultDto<T>
csharp
public class ResultDto<T>
{
public bool IsSuccess { get; set; }
public string Massage { get; set; }
public T Data { get; set; }
}
public bool IsSuccess { get; set; }:
این پراپرتی نیز نشاندهنده موفقیت یا عدم موفقیت یک عملیات است.
public string Massage { get; set; }:
این پراپرتی پیامی را که مربوط به نتیجه عملیات است، ذخیره میکند.
public T Data { get; set; }:
این پراپرتی یک داده از نوع جنریک T را ذخیره میکند. این ویژگی امکان میدهد که کلاس ResultDto<T> برای ذخیره هر نوع دادهای استفاده شود. به عنوان مثال، ممکن است دادهای از نوع User، Product یا هر نوع دیگری باشد.
نتیجهگیری
این دو کلاس ResultDto و ResultDto<T> به شما امکان میدهند که نتایج عملیات مختلف را به صورت استاندارد و یکپارچه مدیریت کنید. ResultDto برای نتایج ساده و ResultDto<T> برای نتایج حاوی دادههای جنریک استفاده میشوند.
Test_Store.Common => Roles => UserRoles.cs
نامفضا (Namespace)
csharp
namespace Test_Store.Common.Roles
این خط، نامفضا (namespace) Test_Store.Common.Roles را تعریف میکند. نامفضاها برای سازماندهی و دستهبندی کدها استفاده میشوند. در اینجا، این نامفضا مربوط به نقشهای کاربری است.
کلاس UserRoles
csharp
public class UserRoles
{
public const string Admin = "Admin";
public const string Operator = "Operator";
public const string Customer = "Customer";
}
public class UserRoles:
این خط کلاس UserRoles را تعریف میکند. این کلاس شامل تعریفهای ثابت (constant) برای نقشهای مختلف کاربران در سیستم است.
public const string Admin = "Admin";:
این خط یک ثابت (constant) عمومی به نام Admin تعریف میکند که مقدار آن برابر با رشته "Admin" است. این ثابت برای شناسایی نقش مدیر (Admin) در سیستم استفاده میشود.
public const string Operator = "Operator";:
این خط یک ثابت (constant) عمومی به نام Operator تعریف میکند که مقدار آن برابر با رشته "Operator" است. این ثابت برای شناسایی نقش اپراتور (Operator) در سیستم استفاده میشود.
public const string Customer = "Customer";:
این خط یک ثابت (constant) عمومی به نام Customer تعریف میکند که مقدار آن برابر با رشته "Customer" است. این ثابت برای شناسایی نقش مشتری (Customer) در سیستم استفاده میشود.
نتیجهگیری
کلاس UserRoles به شما امکان میدهد که نقشهای مختلف کاربران را به صورت ثابت و تعریف شده داشته باشید. این کار میتواند به شما کمک کند تا از مقادیر ثابت در کدهای خود استفاده کنید و از اشتباهات تایپی یا مقادیر اشتباه جلوگیری کنید. این نقشها میتوانند در بخشهای مختلف سیستم مانند احراز هویت و مجوزها استفاده شوند.
Test_Store.Common => Pagination.cs
نامفضا (Namespace)
csharp
namespace Test_Store.Common
این خط، نامفضا (namespace) Test_Store.Common را تعریف میکند. نامفضاها برای سازماندهی و دستهبندی کدها استفاده میشوند.
کلاس Pagination
csharp
public static class Pagination
{
public static IEnumerable<TSource> ToPaged<TSource>(this IEnumerable<TSource> source , int page , int pagSize ,out int rowsCont)
{
rowsCont = source.Count();
return source.Skip((page -1) * pagSize).Take(rowsCont);
}
}
public static class Pagination:
این خط یک کلاس استاتیک به نام Pagination تعریف میکند. کلاسهای استاتیک نمیتوانند نمونهسازی شوند و تمام اعضای آنها نیز باید استاتیک باشند.
متد ToPaged<TSource>
این متد برای صفحهبندی لیستی از آیتمها استفاده میشود. صفحهبندی به معنای تقسیم لیست بلند از آیتمها به صفحات کوچکتر است که به کاربران نمایش داده میشود.
تعریف متد
csharp
public static IEnumerable<TSource> ToPaged<TSource>(this IEnumerable<TSource> source, int page, int pagSize, out int rowsCont)
public static IEnumerable<TSource> ToPaged<TSource>(this IEnumerable<TSource> source, int page, int pagSize, out int rowsCont):
این متد استاتیک و جنریک است و یک IEnumerable<TSource> را برمیگرداند. این متد از یک IEnumerable<TSource> ورودی (source) برای صفحهبندی استفاده میکند.
this IEnumerable<TSource> source:
این قسمت به متد اجازه میدهد که به عنوان یک متد افزونه (extension method) برای انواع IEnumerable<TSource> استفاده شود.
int page:
شماره صفحهای که قرار است بازیابی شود.
int pagSize:
تعداد آیتمهایی که قرار است در هر صفحه نمایش داده شود.
out int rowsCont:
تعداد کل آیتمها در لیست اصلی را برمیگرداند. از out برای برگرداندن این مقدار استفاده میشود.
محتوای متد
csharp
rowsCont = source.Count();
return source.Skip((page - 1) * pagSize).Take(pagSize);
rowsCont = source.Count();:
این خط تعداد کل آیتمهای موجود در لیست اصلی را محاسبه کرده و در متغیر rowsCont ذخیره میکند.
return source.Skip((page - 1) * pagSize).Take(pagSize);:
این خط آیتمهای مورد نظر برای صفحهبندی را انتخاب میکند. ابتدا تعداد آیتمهای صفحههای قبلی را رد میکند (Skip) و سپس تعداد آیتمهای مورد نیاز برای صفحه جاری را برمیدارد (Take).
نتیجهگیری
این کد یک متد افزونه (extension method) به نام ToPaged را تعریف میکند که به هر IEnumerable<TSource> اجازه میدهد تا بهطور کارآمد به صفحات کوچکتر تقسیم شود. این متد صفحهای از آیتمها را بر اساس شماره صفحه و اندازه صفحه بازمیگرداند و تعداد کل آیتمها را نیز برمیگرداند.
Test_Store.Application => Services => Users => Commands => RegisterUser => IRegisterUserService.cs
نامفضا (Namespace)
csharp
namespace Test_Store.Application.Services.Users.Commands.RegisterUser
این خط، نامفضا (namespace) Test_Store.Application.Services.Users.Commands.RegisterUser را تعریف میکند. نامفضاها برای سازماندهی و دستهبندی کدها استفاده میشوند.
تعریف اینترفیس IRegisterUserService
csharp
public interface IRegisterUserService
{
ResultDto<ResultRegisterUser> Execute(RequestRegisterUserDto request);
}
public interface IRegisterUserService:
این خط یک اینترفیس به نام IRegisterUserService تعریف میکند. این اینترفیس شامل متدی به نام Execute است که ورودی آن یک RequestRegisterUserDto و خروجی آن یک ResultDto<ResultRegisterUser> است. این متد برای ثبتنام کاربر استفاده میشود.
کلاس RegisterUserService
این کلاس پیادهسازی اینترفیس IRegisterUserService است و شامل منطق اصلی ثبتنام کاربر است.
تعریف کلاس و سازنده
csharp
public class RegisterUserService : IRegisterUserService
{
private readonly IDataBaseContext _context;
public RegisterUserService(IDataBaseContext context)
{
_context = context;
}
private readonly IDataBaseContext _context;:
این خط یک متغیر خصوصی و فقط خواندنی به نام _context از نوع IDataBaseContext تعریف میکند که برای دسترسی به پایگاه داده استفاده میشود.
public RegisterUserService(IDataBaseContext context):
این سازنده کلاس است که یک نمونه از IDataBaseContext را به عنوان ورودی میپذیرد و آن را به متغیر _context اختصاص میدهد.
متد Execute
csharp
public ResultDto<ResultRegisterUser> Execute(RequestRegisterUserDto request)
{
User user = new User()
{
Email = request.Email,
FullName = request.FullName,
};
List<UserInRole> userInRoles = new List<UserInRole>();
foreach (var item in request.roles)
{
var roles = _context.Roles.Find(item.Id);
userInRoles.Add(new UserInRole
{
Role=roles,
RoleId=roles.Id,
User=user,
UserId=user.Id,
});
}
user.UserInRoles = userInRoles;
_context.Users.Add(user);
_context.SaveChanges();
return new ResultDto<ResultRegisterUser>()
{
Data = new ResultRegisterUser()
{
UserId = user.Id,
},
IsSuccess = true,
Massage = "ثبت نام کاربر انجام شد",
};
}
User user = new User():
این خط یک نمونه جدید از کلاس User ایجاد میکند و ویژگیهای آن را از RequestRegisterUserDto تنظیم میکند.
List<UserInRole> userInRoles = new List<UserInRole>();:
این خط یک لیست جدید از UserInRole ایجاد میکند تا نقشهای کاربر را نگهداری کند.
حلقه foreach: این حلقه برای هر نقش در درخواست کاربر، نقش مربوطه را از پایگاه داده پیدا میکند و آن را به لیست userInRoles اضافه میکند.
user.UserInRoles = userInRoles;:
این خط نقشهای کاربر را به ویژگی UserInRoles اختصاص میدهد.
_context.Users.Add(user);:
این خط کاربر جدید را به دیتابیس اضافه میکند.
_context.SaveChanges();:
این خط تغییرات را در پایگاه داده ذخیره میکند.
بازگشت ResultDto<ResultRegisterUser>: این بخش یک نمونه جدید از ResultDto<ResultRegisterUser> را بازمیگرداند که شامل شناسه کاربر، وضعیت موفقیت و پیام موفقیت است.
کلاسهای DTO
RequestRegisterUserDto
csharp
public class RequestRegisterUserDto
{
public string FullName { get; set; }
public string Email { get; set; }
public List<RolesInRegisterUserDto> roles { get; set; }
}
public string FullName { get; set; }:
نام کامل کاربر.
public string Email { get; set; }: ایمیل کاربر.
public List<RolesInRegisterUserDto> roles { get; set; }:
لیستی از نقشهای کاربر.
RolesInRegisterUserDto
csharp
public class RolesInRegisterUserDto
{
public long Id { get; set; }
}
public long Id { get; set; }:
شناسه نقش.
ResultRegisterUser
csharp
public class ResultRegisterUser
{
public long UserId { get; set; }
}
public long UserId { get; set; }:
شناسه کاربر که بهتازگی ثبتنام شده است.