آموزش معماری پیاز در Asp.net Core
سلام دوستان
در مورد معماری پیاز مطالعات زیادی کردم و توی گوگل هم در مورد Onion Structure یا همون معماری پیازی تحقیق کردم. چند تا سوال داشتم در رابطه با این معماری
- نحوه پیاده سازی صحیح این معماری در Asp.net Core چجوری هست ؟
- این معماری چه کمکی به امنیت در پروژه میکنه ؟
- آیا معماری پیازی و معماری Clean Architecture تفاوت دارن یا مشابه هستن ؟
- نرم افزار بدون معماری چه اشکالاتی رو داره ؟
برای پیاده سازی نرم افزارها معماری های مختلفی به وجود اومده که در طول زمان این معماری ها تغییراتی را داشته اند. تقریبا میشه گفت به ترتیب معماری های زیر بوده
- معماری Hexagonal
- معماری پیازی یا Onion Structure
- معماری تمیز با Clean Architecture
این معماری های ادامه یکدیگر هستند. یعنی وقتی شما در پروژه خودتون از معماری پیازی استفاده می کنید تا حدودی معماری تمیز یا Clean Architecture هم استفاده کردید.
در مورد معماری تمیز یا Clean Architecture می تونید این لینک رو مطالعه کنید. در این جا میخوام بیشتر تمرکز رو روی معماری پیازی قرار بدم.
معماری پیازی چیست ؟
به طور کلی میشه گفت:
- معماری پیازی بر این اساس پیاده سازی شده که همیشه دیتابیس یا Domain پروژه باید در پایینی ترین لایه نرم افزار قرار بگیره.
- تنها Repository ها هستن که می تونن با دیتابیس ارتباط داشته باشن و کویری هایی رو روی اون اجرا کنن.
- ریپازیتوری ها از طرفی با دیتابیس در ارتباط هستن و از طرفی با اینترفیس ها که همون لایه Service نامیده میشه. در واقع با ریپازیتوری ها هم نمیشه مستقیما کار کرد، بلکه باید از طریق لایه Service با اونها در ارتباط بود.
- لایه UI یا کنترلرها در برنامه نویسی MVC هم از اینترفیس ها استفاده میکنه. معمولا اینترفیس ها در کنترلرها Inject یا تزریق میشن.
به ترکیب بالا معماری پیازی گفته میشه. اگر در شکل زیر نگاه کنید دقیقا متوجه میشید که چه ساختاری رو باید در پروژه خودتون پیاده سازی کنید
پیاده سازی معماری پیازی در Asp.net Core به صورت مرحله به مرحله :
خب حالا یک مثال ساده از پیاده سازی معماری پیازی در Asp.net Core و با استفاده از Entity Framwork می بینیم.
- مرحله اول : ایجاد یک انتیتی
یک کلاس به نام Customer با فیلدهای زیر ایجاد می کنیم. در واقع این انتیتی یا کلاس همان جدول ما در دیتابیس خواهد بود
public class Customer
{
[Key]
public int Id { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
}
مرحل دوم : اجرای یک کویری روی انتیتی
حال فرض کنید می خواهیم لیستی از مشتریان را نمایش بدهیم. فرض ما بر این استکه کلاسی هم به نام ApplicationDbContext داریم که نقش دیتابیس در پروژه را بر عهده دارد. خب در معماری پیازی باید همه کویری ها از طریق Repository ها اجرا شوند. بنابراین یک کلاس به نام CustomerRepository ایجاد می کنیم و کویری مورد نظر را درون آن می نویسیم :
public class CustomerRepository
{
private readonly ApplicationDbContext _db;
public CustomerRepository(ApplicationDbContext db)
{
_db = db;
}
public IEnumerable<Customer> CustomerList()
{
var model = _db.Customer_Tbl.ToList();
return model;
}
}
مرحله سوم : ایجاد اینترفیس یا لایه سرویس
خب در مرحله قبل یک کلاس ریپازیتوری ایجاد کردیم و درون اون هم کویری مورد نظر را نوشتیم. حالا برای استفاده از این کویری باید از طریق لایه Service این کار را انجام بدهیم. بنابراین یک اینترفیس مشابه زیر ایجاد می کنیم :
public interface ICustomerRepository
{
IEnumerable<Customer> CustomerList();
}
همانطوری که ملاحظه می کنید درون اینترفیس فقط نام و نوع تابعی که درون ریپازیتوری بود را تعریف کردیم. حالا باید در کلاس CustomerRepository اینترفیس مربوطه را معرفی کنیم.
public class CustomerRepository : ICustomerRepository
{
...
}
خب تا اینجا ریپازیتوری و اینترفیس مربوط به آن ایجاد شد. دقت کنید که ترکیب یک ریپازیتوری و اینترفیس تشکیل یک Service را میدهد. بنابراین در کلاس StartUp.cs و در متد ConfigureService باید این سرویس را معرفی و راه اندازی کنیم :
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<ICustomerRepository, CustomerRepository>();
{
مرحله چهارم : تزریق در کنترلر
در این مرحله می خواهیم در لایه UI یا همان کنترلر از این سرویس استفاده کنیم. یکی از قابلیتهای خوبی که در Asp.net Core وجود دارد پشتیبانی بسیار عالی از تزریق وابستگی یا DependencyInjection می باشد. بنابراین میتوانیم به راحتی با استفاده از این قابلیت ار لایه سرویس استفاده کنیم.
public class HomeController : Controller
{
private readonly ICustomerRepository _icustomer;
public HomeController(ICustomerRepository icustomer)
{
_icustomer = icustomer;
}
public IActionResult Index()
{
var model = _icustomer.CustomerList();
return View(model);
}
}
همانطوری که ملاحظه می کنید با استفاده از تزریق وابستگی به راحتی موفق شدیم از اینترفیس در کنترلر استفاده کنیم و کویری که در ریپازیتوری موجود بود را استفاده کنیم.
معماری پیازی چه تاثیری در امنیت دارد ؟
وقتی می گوییم معماری پیاز باعث امنیت بیشتر پروژه می شود منظور این نیست که اگر سورس پروژه دیکامپایل شد پروژه ما امن است!!! منظور این است که اگر افرادی قصد شنود اطلاعات را از طریق سر راه قرار گرفتن مسیرهای رد و بدل اطلاعات داشته باشند نمی توانند به راحتی به Context اصلی پروژه نزدیک شوند چون در لایه های پایینی می باشد و از این لحظه امنیت بهتری فراهم می آورد.
آیا حتما باید پروژه معماری داشته باشد؟
پروژه های کوچک خیر. اما اگر حجم و اندازه پروژه از حدی فراتر رود نیاز به داشتن یک معماری و یک اصول ضروری بنظر می رسد.
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- نمایش صفحه در پنجره جدید با کلیک روی لینک (تگ a) در Asp
- افزودن مقادیر به صورت دستی به List دریافت شده از ریپازیتوری
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2