ساختار درختی پوشه و فایل
Test_Store
│
├── Doc
│
├── Src
│ ├── Common
│ │ └── library: Test_Store.Common
│ │
│ ├──── Core
│ │ ├──── library: Test_Store.Application
│ │ │ └── Interfaces
│ │ │ └── Contexs
│ │ │ └── IDataBaseCotex.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
│ │ │ └── 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
نصب کتابخانه و پروژهها را به هم مرتبط کردهام
EndPoint.Site
packages
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
projects
Test_Store.Application
Test_Store.Persistence
-----------------------------------
Test_Store.Persistence
packages
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Relational
projects
Test_Store.Application
Test_Store.Domain
----------------------------------------
presentation
packages
Microsoft.EntityFrameworkCore
projects
Test_Store.Domain
--------------------------------------
Test_Store.Application
packages
Microsoft.EntityFrameworkCore
projects
Test_Store.Domain
IDataBaseCotex.cs
استفاده از نامفضاها (Namespaces)
csharp
using Microsoft.EntityFrameworkCore;
using Test_Store.Domain.Entities.Users;
using Microsoft.EntityFrameworkCore;:
این دستور به شما امکان میدهد تا از امکانات و کلاسهای ارائهشده توسط Entity Framework Core استفاده کنید.
using Test_Store.Domain.Entities.Users;:
این دستور برای دسترسی به کلاسها و موجودیتهایی که در نامفضای Test_Store.Domain.Entities.Users تعریف شدهاند، استفاده میشود.
تعریف اینترفیس IDataBaseContext
اینترفیس IDataBaseContext وظایفی را برای تعامل با پایگاه داده تعریف میکند. این اینترفیس شامل متدها و پراپرتیهای ضروری برای انجام عملیات CRUD و مدیریت تغییرات است.
csharp
namespace Test_Store.Application.Interfaces.Contexs
{
public interface IDataBaseContext
{
DbSet<User> Users { get; set; }
DbSet<Role> Roles { get; set; }
DbSet<UserInRole> UsersInRoles { get; set; }
int SaveChanges(bool accaptAllChangesOnSuccess);
int SaveChanges();
Task<int> SaveChangesAsync(bool accaptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());
}
}
توضیحات اجزای اینترفیس
DbSet<User> Users { get; set; }:
یک مجموعه از موجودیتهای User را نشان میدهد که از طریق اینترفیس IDataBaseContext قابل دسترسی و مدیریت هستند.
DbSet<Role> Roles { get; set; }:
یک مجموعه از موجودیتهای Role را نشان میدهد.
DbSet<UserInRole> UsersInRoles { get; set; }:
یک مجموعه از موجودیتهای UserInRole را نشان میدهد.
int SaveChanges(bool accaptAllChangesOnSuccess);:
این متد برای ذخیره تغییرات در پایگاه داده بهصورت همزمان (synchronous) استفاده میشود. این متد دو پارامتر میپذیرد:
bool acceptAllChangesOnSuccess:
نشاندهنده اینکه آیا تمامی تغییرات باید با موفقیت اعمال شوند یا خیر.
نوع بازگشتی int: تعداد رکوردهای تغییر یافته را برمیگرداند.
int SaveChanges();:
نسخه سادهتر متد SaveChanges بدون پارامتر.
Task<int> SaveChangesAsync(bool accaptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());:
این متد برای ذخیره تغییرات بهصورت غیر همزمان (asynchronous) استفاده میشود. این متد دو پارامتر میپذیرد:
bool acceptAllChangesOnSuccess:
نشاندهنده اینکه آیا تمامی تغییرات باید با موفقیت اعمال شوند یا خیر.
CancellationToken cancellationToken:
برای لغو عملیات استفاده میشود.
نوع بازگشتی Task<int>: یک Task که تعداد رکوردهای تغییر یافته را برمیگرداند.
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());: نسخه سادهتر متد SaveChangesAsync بدون پارامتر acceptAllChangesOnSuccess.
نتیجهگیری
این کد به شما امکان میدهد تا تعاملات با پایگاه داده را به صورت استاندارد و قابل گسترش تعریف کنید. با استفاده از این اینترفیس میتوانید تغییرات را ذخیره کنید و موجودیتها را مدیریت کنید.
Role.cs
User.cs
UserInRole.cs
نامفضا (Namespace)
csharp
namespace Test_Store.Domain.Entities.Users
این خط، نامفضای (namespace) Test_Store.Domain.Entities.Users را تعریف میکند. این نامفضا برای سازماندهی کلاسها و موجودیتهای مرتبط با کاربران و نقشها استفاده میشود.
کلاس User
csharp
public class User
{
public long Id { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public ICollection<UserInRole> UserInRoles { get; set; }
}
public long Id { get; set; }:
این پراپرتی شناسهی منحصربهفرد (ID) برای کاربر را نشان میدهد.
public string FullName { get; set; }:
این پراپرتی نام کامل کاربر را ذخیره میکند.
public string Email { get; set; }:
این پراپرتی ایمیل کاربر را ذخیره میکند.
public string Password { get; set; }:
این پراپرتی رمز عبور کاربر را ذخیره میکند.
public ICollection<UserInRole> UserInRoles { get; set; }:
این پراپرتی یک مجموعه از نقشهایی را که کاربر در آنها قرار دارد، نگهداری میکند. این مجموعه ارتباط چند به چند بین کاربران و نقشها را مدل میکند.
کلاس Role
csharp
public class Role
{
public long Id { get; set; }
public string Name { get; set; }
public ICollection<UserInRole> UserInRoles { get; set; }
}
public long Id { get; set; }:
این پراپرتی شناسهی منحصربهفرد (ID) برای نقش را نشان میدهد.
public string Name { get; set; }:
این پراپرتی نام نقش را ذخیره میکند.
public ICollection<UserInRole> UserInRoles { get; set; }:
این پراپرتی یک مجموعه از کاربرانی را که در این نقش هستند، نگهداری میکند. این مجموعه ارتباط چند به چند بین کاربران و نقشها را مدل میکند.
کلاس UserInRole
csharp
public class UserInRole
{
public long Id { get; set; }
public virtual User User { get; set; }
public long UserId { get; set; }
public virtual Role Role { get; set; }
public long RoleId { get; set; }
}
public long Id { get; set; }:
این پراپرتی شناسهی منحصربهفرد (ID) برای موجودیت UserInRole را نشان میدهد.
public virtual User User { get; set; }:
این پراپرتی یک شیء از نوع User را نشان میدهد که به آن کاربر اشاره دارد.
public long UserId { get; set; }:
این پراپرتی شناسه کاربری که در این نقش قرار دارد را ذخیره میکند.
public virtual Role Role { get; set; }:
این پراپرتی یک شیء از نوع Role را نشان میدهد که به آن نقش اشاره دارد.
public long RoleId { get; set; }:
این پراپرتی شناسه نقشی که کاربر در آن قرار دارد را ذخیره میکند.
نتیجهگیری
این کد سه کلاس User، Role و UserInRole را تعریف میکند که برای مدلسازی کاربران و نقشهای آنها در یک سیستم استفاده میشوند. این کلاسها به شما امکان میدهند تا ارتباطات بین کاربران و نقشها را به خوبی مدیریت و پیادهسازی کنید.
DataBaseContext.cs
استفاده از نامفضاها (Namespaces)
csharp
using Microsoft.EntityFrameworkCore;
using Test_Store.Application.Interfaces.Contexs;
using Test_Store.Domain.Entities.Users;
using Microsoft.EntityFrameworkCore;:
این دستور به شما امکان میدهد تا از امکانات و کلاسهای ارائهشده توسط Entity Framework Core استفاده کنید.
using Test_Store.Application.Interfaces.Contexs;:
این دستور برای دسترسی به اینترفیسهای موجود در Test_Store.Application.Interfaces.Contexs استفاده میشود.
using Test_Store.Domain.Entities.Users;:
این دستور برای دسترسی به کلاسها و موجودیتهایی که در نامفضای Test_Store.Domain.Entities.Users تعریف شدهاند، استفاده میشود.
تعریف نامفضا و کلاس
csharp
namespace Test_Store.Persistence.Context
{
public class DataBaseContext : DbContext, IDataBaseContext
{
public DataBaseContext(DbContextOptions options) : base(options)
{
}
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<UserInRole> UsersInRoles { get; set; }
}
}
namespace Test_Store.Persistence.Context:
این بخش، نامفضا (namespace) را تعریف میکند که کدهای مربوط به این کلاس در آن قرار دارند. نامفضاها برای سازماندهی و دستهبندی کدها استفاده میشوند.
public class DataBaseContext : DbContext, IDataBaseContext:
این خط کلاس DataBaseContext را تعریف میکند که از DbContext ارثبری میکند و اینترفیس IDataBaseContext را پیادهسازی میکند. این کلاس برای مدیریت و تعامل با پایگاه داده استفاده میشود.
سازنده کلاس DataBaseContext
csharp
public DataBaseContext(DbContextOptions options) : base(options)
{
}
public DataBaseContext(DbContextOptions options) : base(options):
این سازنده کلاس DataBaseContext است که پارامتر options از نوع DbContextOptions را دریافت میکند و آن را به سازنده پایه (base) یعنی سازنده کلاس DbContext منتقل میکند. این پارامتر تنظیمات و گزینههای مورد نیاز برای پیکربندی دیتابیس را شامل میشود.
پراپرتیهای DbSet
csharp
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<UserInRole> UsersInRoles { get; set; }
public DbSet<User> Users { get; set; }:
این پراپرتی مجموعهای از موجودیتهای User را نشان میدهد که توسط Entity Framework برای تعامل با جدول کاربران در پایگاه داده استفاده میشود.
public DbSet<Role> Roles { get; set; }:
این پراپرتی مجموعهای از موجودیتهای Role را نشان میدهد که توسط Entity Framework برای تعامل با جدول نقشها در پایگاه داده استفاده میشود.
public DbSet<UserInRole> UsersInRoles { get; set; }:
این پراپرتی مجموعهای از موجودیتهای UserInRole را نشان میدهد که توسط Entity Framework برای تعامل با جدول ارتباطی کاربران و نقشها در پایگاه داده استفاده میشود.
نتیجهگیری
این کد یک کلاس DataBaseContext را تعریف میکند که از DbContext ارثبری کرده و اینترفیس IDataBaseContext را پیادهسازی میکند. این کلاس برای تعامل با پایگاه داده و مدیریت موجودیتهای User، Role و UserInRole استفاده میشود. با استفاده از این کد، شما میتوانید عملیات CRUD (ایجاد، خواندن، بهروزرسانی و حذف) را بر روی این موجودیتها انجام دهید.
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 که برای تولید فرمها و لینکها استفاده میشوند.