Areas
در ASP.NET Core MVC یک روش برای سازماندهی و مدیریت بخشهای مختلف یک برنامه وب به صورت مجزا و مجزاست. با استفاده از Areas، میتوانید برنامه خود را به بخشهای کوچکتر و مجزا تقسیم کنید که هر یک دارای کنترلرها، ویوها و مدلهای خود هستند. این ساختار به خصوص برای پروژههای بزرگ و پیچیده بسیار مفید است.
تعریف و هدف Areas
Areas
به شما امکان میدهند تا بخشهای مختلف برنامه خود را به صورت مجزا سازماندهی کنید. به عنوان مثال، میتوانید یک Area برای بخش مدیریت (Admin) و یک Area برای بخش کاربران (User) ایجاد کنید. هر Area میتواند ساختار خود را داشته باشد و به صورت مستقل توسعه و مدیریت شود.
نحوه استفاده از Areas در ASP.NET Core MVC
1. ایجاد Area
برای ایجاد یک Area در پروژه ASP.NET Core MVC، مراحل زیر را دنبال کنید:
1. ایجاد پوشه Area:
- در ریشه پروژه، یک پوشه به نام
Areasایجاد کنید. 2. ایجاد پوشه Area مشخص: - در داخل پوشه
Areas, یک پوشه برای Area جدید خود ایجاد کنید. به عنوان مثال،
Admin. 3. ایجاد پوشههای داخلی: - در داخل پوشه
Admin, پوشههای
Controllers,
Views, و
Modelsرا ایجاد کنید. 2. ایجاد کنترلرها و ویوها در Area برای مثال، فرض کنید یک Area به نام
Adminایجاد کردهاید. اکنون میتوانید کنترلرها و ویوها را در این Area ایجاد کنید. کنترلر در Area Admin: csharp using Microsoft.AspNetCore.Mvc; namespace YourProject.Areas.Admin.Controllers { [Area("Admin")] public class HomeController : Controller { public IActionResult Index() { return View(); } } } ویو در Area Admin: - یک پوشه به نام
Homeدر مسیر
Areas/Admin/Viewsایجاد کنید. - یک فایل ویو به نام Index.cshtml در پوشه
Homeایجاد کنید. 3. تنظیم مسیریابی برای Areas برای تنظیم مسیریابی برای Areas، باید کد زیر را در فایل Program.cs خود اضافه کنید: csharp app.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); این کد به ASP.NET Core میگوید که مسیرهای مربوط به Areas باید شامل نام Area باشند. مثال کامل از ساختار پروژه با Area فرض کنید شما یک Area به نام
Adminو یک Area به نام
Userدارید. ساختار پروژه شما به این صورت خواهد بود: YourProject │ ├── Areas │ ├── Admin │ │ ├── Controllers │ │ │ └── HomeController.cs │ │ ├── Views │ │ │ └── Home │ │ │ └── Index.cshtml │ │ └── Models │ └── User │ ├── Controllers │ ├── Views │ └── Models ├── Controllers ├── Views ├── Models ├── wwwroot └── Program.cs مزایای استفاده از Areas 1. سازماندهی بهتر: تقسیم برنامه به بخشهای مجزا و مستقل. 2. مدیریت آسانتر: امکان توسعه و نگهداری هر بخش به صورت مستقل. 3. کاهش پیچیدگی: جلوگیری از بروز تعارضات بین کنترلرها و ویوها در بخشهای مختلف. نتیجهگیری Areas در ASP.NET Core MVC به شما کمک میکنند تا برنامه خود را به صورت منطقی و سازمانیافته مدیریت کنید. با استفاده از Areas، میتوانید برنامههای بزرگ و پیچیده را به راحتی مدیریت و توسعه دهید.
برای تایپ کاراکترهای خاص مانند └, ├, و ─ در ویندوز، میتوانید از کدهای Alt استفاده کنید. این کدها به شما اجازه میدهند تا با استفاده از ترکیب کلید Alt و یک کد عددی، کاراکترهای خاص را تایپ کنید.
نحوه استفاده از کدهای Alt:
فعال کردن Num Lock: مطمئن شوید که کلید Num Lock روی صفحهکلید شما فعال است.
فشار دادن کلید Alt: کلید Alt را فشار دهید و نگه دارید.
وارد کردن کد عددی: در حالی که کلید Alt نگه داشتهاید، کد عددی مربوط به کاراکتر مورد نظر را روی صفحهکلید عددی وارد کنید.
رها کردن کلید Alt: کلید Alt را رها کنید. کاراکتر مورد نظر باید ظاهر شود.
کدهای Alt برای کاراکترهای خاص:
└ (کد Alt: 192):
Alt + 192
├ (کد Alt: 195):
Alt + 195
─ (کد Alt: 196):
Alt + 196
مثال:
برای تایپ کاراکتر └:
کلید Alt را نگه دارید.
کد عددی 192 را روی صفحهکلید عددی تایپ کنید.
کلید Alt را رها کنید.
اگر از کیبورد فارسی استفاده میکنید:
ممکن است کدهای Alt روی برخی از کیبوردهای فارسی کار نکند. در این صورت، میتوانید از روشهای دیگری مانند کپی و پیست استفاده کنید:
کپی کردن کاراکتر:
از اینجا کاراکترهای مورد نظر خود را کپی کنید: └, ├, ─.
پیست کردن کاراکتر:
در هر جایی که نیاز دارید، کاراکترها را پیست کنید.
استفاده از ابزارهای آنلاین:
همچنین میتوانید از ابزارهای آنلاین برای پیدا کردن و کپی کردن کاراکترهای خاص استفاده کنید. وبسایتهایی مانند CopyChar یا Unicode-Table به شما اجازه میدهند تا کاراکترهای خاص را به راحتی پیدا کرده و کپی کنید.
مثال در Notepad:
YourProject
│
├── Areas
│ ├── Admin
│ │ ├── Controllers
│ │ │ └── HomeController.cs
│ │ ├── Views
│ │ │ └── Home
│ │ │ └── Index.cshtml
│ │ └── Models
│ └── User
│ ├── Controllers
│ ├── Views
│ └── Models
├── Controllers
├── Views
├── Models
├── wwwroot
└── Program.cs
برای دسترسی به فهرست کاراکترهای خاص و استفاده از آنها، شما میتوانید از منابع مختلفی استفاده کنید. در ادامه فهرستی از منابع آنلاین برای کاراکترهای خاص و کدهای Alt آورده شده است:
1. وبسایت Unicode-Table
https://symbl.cc
Unicode-Table یک منبع عالی برای یافتن و کپی کردن کاراکترهای خاص به همراه کدهای Alt و اطلاعات بیشتر درباره هر کاراکتر.
2. وبسایت CopyChar
https://copychar.cc
CopyChar
به شما اجازه میدهد تا به راحتی کاراکترهای خاص را جستجو کنید و آنها را کپی کنید.
3. فهرست کدهای Alt برای کاراکترهای خاص در ویندوز
برای استفاده از کدهای Alt، میتوانید از فهرست زیر استفاده کنید:
ساختار درختی پوشه و فایل
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