الگوی طراحی درخواست-نقطه-پاسخ-پاسخ را بپذیرید تا توسعه API را ساده کنید و کد خود را پاکتر، کارآمدتر و نگهداری آسانتر کنید.
الگوهای طراحی برای رفع مشکلاتی که اغلب در برنامه های نرم افزاری با آن مواجه می شوند، تکامل یافته اند. آنها راه حل هایی برای مشکلات و پیچیدگی های تکراری در طراحی نرم افزار هستند. ما در اینجا بسیاری از الگوهای طراحی از جمله الگوی مشخصات، واحد الگوی کار، الگوی شی تهی، گزینهها را مورد بحث قرار دادهایم. الگو، الگوی flyweight، الگوی فرمان، الگوی مترجم، و الگوی تکتنه .
در این پست به الگوی طراحی REPR (درخواست-نقطه-پاسخ) می پردازیم، چگونه توسعه API ها را ساده می کند و چگونه می توان آن را در C# پیاده سازی کرد.
برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا دانلود کنید.
الگوی طراحی REPR چیست؟
الگوی طراحی REPR رویکردی است که به توسعهدهندگان کمک میکند تا با جداسازی نگرانیها، قابلیت نگهداری، قابلیت استفاده مجدد و توسعهپذیری کد را افزایش دهند. توسعهدهندگان ممکن است با تمرکز بر درخواست، نقطه پایانی و پاسخ، APIهایی با ساختار خوب و به راحتی قابل گسترش ایجاد کنند.
الگوی طراحی REPR مدولارسازی را ارتقا میدهد و جدایی متمایز بین درخواست ورودی، منطق در نقطه پایانی و پاسخ خروجی را تضمین میکند. شبیه به معماری برش عمودی، الگوی طراحی REPR توسعه API را با سازماندهی API های شما در اطراف نقاط انتهایی به جای کنترلرها ساده می کند. به یاد داشته باشید که الگوی طراحی REPR نه مبتنی بر REST است و نه مبتنی بر منابع. در عوض، این الگویی است که برای تعریف نقاط پایانی API شما استفاده میشود.
چرا از الگوی طراحی REPR استفاده کنیم؟
الگوی MVC (model-view-controller) به طور سنتی برای ساختن نقاط انتهایی API استفاده میشود. در حالی که الگوی MVC مزایای متعددی دارد، یکی از محدودیتهای اصلی این رویکرد، کنترلکنندههای متورم است که به «مشکل کنترلکننده متورم» معروف است. این به این دلیل است که اغلب کنترلکنندهها روشهای متفاوتی دارند که منسجم نیستند (هرگز با یکدیگر تماس نمیگیرند) و واقعاً به هم تعلق ندارند. در نتیجه، برنامه از روشهای مبتنی بر REST دور میشود و به مجموعهای از روشها که در نقاط پایانی HTTP در معرض دید قرار میگیرند، ختم میشود.
الگوی REPR مشکل نفخ کنترلر را با حذف نیاز به چندین روش عمل در یک کنترلر حل می کند. در عوض، الگوی REPR به اصل مسئولیت واحد پایبند است و به شما این امکان را میدهد که در یک مورد معمول، یک کنترلر در هر عمل پشتیبانی کنید. سایر مزایای کلیدی عبارتند از جداسازی نگرانی ها، بهبود قابلیت استفاده مجدد کد، بهبود خوانایی و قابلیت نگهداری، آزمایش پذیری بهتر و اشکال زدایی ساده تر، و بهبود امنیت و مقیاس پذیری.
با این حال، الگوی REPR دارای جنبه های منفی خاصی نیز می باشد. اینها شامل افزایش پیچیدگی و تکراری شدن کد است.
یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید
برای ایجاد یک پروژه ASP.NET Core 8 Web API در Visual Studio 2022، مراحل ذکر شده در زیر را دنبال کنید.
- Visual Studio 2022 IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره «پیکربندی پروژه جدید»، نام و مکان پروژه جدید را مشخص کنید. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب “قرار دادن راه حل و پروژه در همان فهرست” را علامت بزنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی” که در ادامه نشان داده شده است، “NET 8.0 (Long Term Support)” را به عنوان نسخه چارچوب انتخاب کنید و مطمئن شوید که کادر “Use controllers” علامت زده شده است. ما در این پروژه از کنترلرها استفاده خواهیم کرد.
- در جای دیگری از پنجره «اطلاعات اضافی»، «نوع احراز هویت» را روی «هیچکدام» (پیشفرض) بگذارید و مطمئن شوید که کادرهای «فعال کردن پشتیبانی باز API»، «پیکربندی برای HTTPS» و «فعال کردن داکر» را انتخاب کنید. ” کنترل نشده باقی بماند. ما در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
ما از این پروژه ASP.NET Core Web API برای کار با الگوی طراحی REPR در بخشهای زیر استفاده خواهیم کرد.
اجزای الگوی طراحی REPR
همانطور که از نام آن پیداست، الگوی طراحی REPR شامل سه جزء است:
- درخواست: این نشان دهنده داده های ورودی است که نقطه پایانی انتظار دارد. این اشیاء درخواست باید برای اعتبار سنجی ورودی و ارسال داده ها بین لایه های برنامه استفاده شوند.
- نقطه پایانی: این نشان دهنده منطقی است که توسط نقطه پایانی برای یک درخواست معین اجرا شده است.
- پاسخ: این نشان دهنده داده های خروجی است که نقطه پایانی برمی گرداند.
یک شی درخواست ایجاد کنید
قطعه کد زیر یک کلاس درخواست معمولی را نشان می دهد.
public class CreateUserRequest { public int UserId { get; set; } public string Username { get; set; } public string Password { get; set; } public string Email { get; set; } }
به طور مشابه، یک کلاس درخواست برای ایجاد یک محصول جدید به این صورت است:
public class CreateProductRequest { public int Id { get; set; } public string ProductName { get; set; } public string Category { get; set; } public string Description { get; set; } public decimal Quantity { get; set; } public decimal Price { get; set; } }
و یک کلاس درخواست برای بازیابی اطلاعات محصول به این صورت است:
public class GetProductRequest { public int Id { get; set; } public string ProductName { get; set; } public string Description { get; set; } public decimal Price { get; set; } }
منطق را در نقطه پایانی پیاده سازی کنید
به پوشه Controllers در پروژه ای که قبلا ایجاد کردید مراجعه کنید. روی پوشه Controllers کلیک راست کرده و یک کنترلر API جدید با نام CreateProductController ایجاد کنید. کد تولید شده پیش فرض را با کد زیر جایگزین کنید.
using Microsoft.AspNetCore.Mvc; namespace REPR_Example.ProductAPI.Endpoints.Product.CreateProduct { [Route("api/[controller]")] [ApiController] public class CreateProductController : ControllerBase { [HttpPost(Name = "GetProducts")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult GetProductsAsync( GetProductRequest getProductRequest) { //Write your code here to retrieve products. return NoContent(); } [HttpPost(Name = "CreateProduct")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult CreateProductAsync (CreateProductRequest createProductRequest) { //Write your code here to implement logic such as, //validation, mapping etc. return NoContent(); } } }
اکنون، نقطه پایانی HTTP GET زیر را در نظر بگیرید.
https://localhost:4586/api/getproducts
هنگامی که این نقطه پایانی زده میشود، پاسخ معمولی در JSON به این شکل خواهد بود:
{ "products": [ { "id": 1, "name": "HP ZBook Laptop", "description": " i9 Laptop with 32 GB RAM and 1 TB SSD", "price": 2500 }, { "id": 2, "name": "Lenovo Thinkpad Laptop", "description": "i9 Laptop with 16 GB RAM and 1 TB SSD", "price": 1500 } ] }
شیء پاسخ را ایجاد کنید
آخرین اما نه کم اهمیت، قطعه کد زیر یک کلاس پاسخ معمولی را نشان می دهد.
public class CreateProductResponse { public int StatusCode { get; set; } public string ErrorMessage { get; set; } }
در اینجا باید توجه داشت که همه نقاط پایانی به داده های ورودی برای کلاس های درخواست یا پاسخ نیاز ندارند. در بسیاری از موارد، ممکن است فقط نیاز به ارسال کد وضعیت HTTP در پاسخ داشته باشید.
مورد استفاده از الگوی REPR
یک مورد استفاده معمول از الگوی REPR CQRS است. (تفکیک مسئولیت فرمان و پرس و جو)، که در آن شما باید یک نقطه پایانی جداگانه برای هر دستور و پرس و جو داشته باشید. معماری برش عمودی یکی دیگر از موارد استفاده از الگوی REPR است که در آن برنامه بسته به مسئولیت آنها به لایه های عمودی تقسیم می شود.
گفته شد، شما مجبور نیستید از REPR برای ساختن سبک خاصی از معماری استفاده کنید. شما می توانید منابع RESTful و حتی نقاط پایانی به سبک RPC را با استفاده از الگوی طراحی REPR تعریف کنید. می توانید بر اساس نیازهای برنامه خود تصمیم به انتخاب این الگو بگیرید.
الگوی طراحی REPR با جداسازی لایههای مختلف برنامهتان، مانند رابط کاربری، منطق تجاری، و لایههای دسترسی به داده، به بهبود خوانایی، قابلیت نگهداری و مقیاسپذیری پایه کد شما کمک میکند. میتوانید الگوی REPR را مطابق با نیاز خود با ترکیب لایهها یا اجزای اضافی تغییر داده و گسترش دهید.
پست های مرتبط
نحوه استفاده از الگوی طراحی REPR در ASP.NET Core
نحوه استفاده از الگوی طراحی REPR در ASP.NET Core
نحوه استفاده از الگوی طراحی REPR در ASP.NET Core