آموزش ASP.NET Core 10؛ از Web API تا پروژه واقعی
ساخت Web API و سرویسهای واقعی با ASP.NET Core 10؛ Routing، DI، EF Core، Validation و امنیت.
سرفصل جلسات دوره
15 جلسه<div class='lesson-rich-content'> <h2>جلسه 1: یک درخواست از کجا میآید و کجا میرود؟</h2> <h3>تمرکز جلسه</h3> <p> شناخت Program، Middleware، Pipeline و نقش سرویسها در چرخه پردازش یک HTTP Request. </p> <h3>چرا این مبحث مهم است؟</h3> <p> درک Pipeline پایه اصلی Debugging و توسعه قابلیتهای Cross-Cutting در ASP.NET Core است. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> یک Web API ساده میسازید و با Middleware مسیر عبور Request تا Response را مشاهده و ثبت میکنید. </p> <h3>اشتباه رایج</h3> <p> نگاه کردن به Controller یا Endpoint بدون درک Middleware. </p> <h3>چالش جلسه</h3> <p> Middlewareای طراحی کنید که زمان پردازش هر درخواست و Endpoint اجراشده را گزارش کند. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 2: Routing؛ طراحی URLهایی که قابل پیشبینی هستند</h2> <h3>تمرکز جلسه</h3> <p> Route Template، پارامترها، Constraintها و اصول طراحی URL برای APIهای RESTful. </p> <h3>چرا این مبحث مهم است؟</h3> <p> Routing قرارداد اصلی بین مصرفکننده API و سرویس شماست. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> Endpointهای CRUD برای محصولات طراحی میکنید و برای هر عملیات HTTP Status Code مناسب برمیگردانید. </p> <h3>اشتباه رایج</h3> <p> استفاده از URLهای نامنظم و وابسته به جزئیات پیادهسازی. </p> <h3>چالش جلسه</h3> <p> مسیرهای یک فروشگاه را برای Product، Category و Order طراحی کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 3: Minimal API یا Controller؛ کدام انتخاب بهتری است؟</h2> <h3>تمرکز جلسه</h3> <p> تفاوت Minimal API و Controller و معیارهای انتخاب هر رویکرد. </p> <h3>چرا این مبحث مهم است؟</h3> <p> انتخاب سبک معماری باید بر اساس نیاز پروژه باشد، نه صرفاً محبوبیت یک روش. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> یک Endpoint را با هر دو رویکرد پیاده میکنید و تفاوت سازماندهی و خوانایی را بررسی میکنید. </p> <h3>اشتباه رایج</h3> <p> تبدیل همه پروژهها به یک رویکرد بدون توجه به اندازه و پیچیدگی. </p> <h3>چالش جلسه</h3> <p> برای یک API کوچک و یک سامانه سازمانی تصمیم بگیرید از کدام رویکرد استفاده میکنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 4: Dependency Injection در عمل؛ وابستگیها را مدیریت کنیم</h2> <h3>تمرکز جلسه</h3> <p> Service Registration، Lifetimeهای Scoped، Singleton و Transient. </p> <h3>چرا این مبحث مهم است؟</h3> <p> DI باعث میشود اجزای برنامه کمتر به پیادهسازی مشخص وابسته باشند. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> منطق قیمتگذاری را از Endpoint جدا میکنید و سرویس مربوطه را از طریق DI دریافت میکنید. </p> <h3>اشتباه رایج</h3> <p> استفاده اشتباه از Lifetimeها که باعث مصرف نادرست منابع میشود. </p> <h3>چالش جلسه</h3> <p> سه سرویس مختلف طراحی کنید و برای هرکدام Lifetime مناسب انتخاب کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 5: DTO؛ قرارداد ورودی و خروجی API</h2> <h3>تمرکز جلسه</h3> <p> تفکیک DTO از Entity و کنترل دقیق دادههایی که وارد یا خارج API میشوند. </p> <h3>چرا این مبحث مهم است؟</h3> <p> DTOها مرز قرارداد API را مشخص میکنند. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> برای Product مدلهای Request و Response طراحی میکنید و فیلدهای داخلی را از خروجی حذف میکنید. </p> <h3>اشتباه رایج</h3> <p> برگرداندن مستقیم Entity در تمام Endpointها. </p> <h3>چالش جلسه</h3> <p> برای Product دو DTO ورودی و یک DTO خروجی طراحی کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 6: EF Core و DbContext؛ اتصال برنامه به دیتابیس</h2> <h3>تمرکز جلسه</h3> <p> Entity، DbSet، DbContext، Migration و چرخه دسترسی برنامه به دادهها. </p> <h3>چرا این مبحث مهم است؟</h3> <p> EF Core بخش مهمی از ارتباط لایه Application با دیتابیس است. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> مدل Product را به EF Core متصل میکنید، Migration ایجاد میکنید و ساختار دیتابیس را اعمال میکنید. </p> <h3>اشتباه رایج</h3> <p> نگه داشتن DbContext بهعنوان محل تمام منطق برنامه. </p> <h3>چالش جلسه</h3> <p> یک مدل Product طراحی کنید، Migration ایجاد کنید و تغییر بعدی مدل را اعمال کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 7: روابط بین موجودیتها و Queryهای کاربردی</h2> <h3>تمرکز جلسه</h3> <p> رابطههای One-to-Many، Navigation Property، Include و انتخاب داده مورد نیاز. </p> <h3>چرا این مبحث مهم است؟</h3> <p> بیشتر سیستمهای واقعی از جدولهای مستقل تشکیل نشدهاند. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> ارتباط Customer و Order را ایجاد میکنید و Query سفارشهای هر مشتری را مینویسید. </p> <h3>اشتباه رایج</h3> <p> استفاده بیرویه از Include که حجم داده را افزایش میدهد. </p> <h3>چالش جلسه</h3> <p> گزارشی طراحی کنید که اطلاعات مشتری و خلاصه سفارشهای او را برگرداند. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 8: Validation و مدیریت خطا؛ API باید پاسخ قابل فهم بدهد</h2> <h3>تمرکز جلسه</h3> <p> اعتبارسنجی ورودی، خطاهای کسبوکار و طراحی Responseهای استاندارد برای خطا. </p> <h3>چرا این مبحث مهم است؟</h3> <p> مصرفکننده API باید بداند چرا درخواست رد شده است. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> ثبت سفارش را با Validation کامل میکنید و برای ورودی نامعتبر پاسخ 400 قابل فهم تولید میکنید. </p> <h3>اشتباه رایج</h3> <p> نمایش Stack Trace یا Exception داخلی به کاربر. </p> <h3>چالش جلسه</h3> <p> برای ثبت سفارش چند خطای مستقل تعریف کنید و برای هرکدام Response مشخص طراحی کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 9: لایه سرویس؛ جدا کردن منطق کسبوکار از Endpoint</h2> <h3>تمرکز جلسه</h3> <p> تفکیک مسئولیت Controller، Service و Data Access. </p> <h3>چرا این مبحث مهم است؟</h3> <p> وقتی منطق کسبوکار از HTTP جدا باشد، تست و استفاده مجدد سادهتر میشود. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> یک Feature کامل را از Endpoint تا Service و DbContext با مسئولیتهای مشخص پیاده میکنید. </p> <h3>اشتباه رایج</h3> <p> ساختن لایههای متعدد بدون مسئولیت مشخص. </p> <h3>چالش جلسه</h3> <p> یک Feature ثبت سفارش را تحلیل کنید و مرز Endpoint و Service را مشخص کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 10: احراز هویت و کنترل دسترسی</h2> <h3>تمرکز جلسه</h3> <p> Authentication، Authorization، Claim، Role و Policy. </p> <h3>چرا این مبحث مهم است؟</h3> <p> شناخت تفاوت هویت و مجوز دسترسی برای ساخت API امن ضروری است. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> Endpoint مدیریت را محافظت میکنید و دسترسی را بر اساس Role یا Policy محدود میکنید. </p> <h3>اشتباه رایج</h3> <p> احراز هویت موفق به معنی دسترسی به همه منابع نیست. </p> <h3>چالش جلسه</h3> <p> دو Policy متفاوت برای کاربران عادی و مدیر ایجاد کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 11: Logging، Configuration و مدیریت Secretها</h2> <h3>تمرکز جلسه</h3> <p> Configuration، محیطهای مختلف اجرا، Logging ساختاریافته و جداسازی اطلاعات حساس. </p> <h3>چرا این مبحث مهم است؟</h3> <p> در محیط واقعی باید بتوان رفتار سرویس را بررسی کرد، بدون افشای اطلاعات حساس. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> برای عملیات سفارش Logging اضافه میکنید و Connection String و Secretها را از کد جدا میکنید. </p> <h3>اشتباه رایج</h3> <p> ثبت Token، Password یا اطلاعات شخصی کاربران در Log. </p> <h3>چالش جلسه</h3> <p> برای یک عملیات حساس چند Log مناسب طراحی کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 12: مستندسازی API با OpenAPI</h2> <h3>تمرکز جلسه</h3> <p> تعریف قرارداد Endpointها، Request و Response و ارائه مستندات قابل استفاده. </p> <h3>چرا این مبحث مهم است؟</h3> <p> مستندات خوب زمان اتصال سرویسهای دیگر به API را کاهش میدهد. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> Endpointهای پروژه را مستند میکنید و نمونه Request و Response ارائه میدهید. </p> <h3>اشتباه رایج</h3> <p> مستندسازی فقط فهرست کردن URLها بدون تعریف قرارداد ورودی و خروجی. </p> <h3>چالش جلسه</h3> <p> مستندات کامل یکی از Featureها را بنویسید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 13: تست سناریوهای حیاتی API</h2> <h3>تمرکز جلسه</h3> <p> تست منطق سرویس، رفتار Endpointها و انتخاب سناریوهای مهم. </p> <h3>چرا این مبحث مهم است؟</h3> <p> تست خوب فقط برای پیدا کردن Bug نیست؛ قرارداد رفتاری سیستم را مشخص میکند. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> برای ثبت سفارش، Validation، دسترسی غیرمجاز و سناریوهای موفق چند تست مشخص طراحی میکنید. </p> <h3>اشتباه رایج</h3> <p> تمرکز صرف بر تست مسیر موفق. </p> <h3>چالش جلسه</h3> <p> برای Feature ثبت سفارش حداقل پنج سناریو تعریف کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 14: Performance و امنیت عملی؛ از Query تا کنترل درخواست</h2> <h3>تمرکز جلسه</h3> <p> بررسی Queryهای اضافی، کاهش داده دریافتی، Cache، Rate Limiting و اصول امنیتی. </p> <h3>چرا این مبحث مهم است؟</h3> <p> عملکرد و امنیت معمولاً پس از اضافه شدن کاربران و دادههای بیشتر اهمیت جدی پیدا میکنند. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> یک Query کند را بررسی میکنید، داده غیرضروری را حذف میکنید و نقاط حساس API را بررسی میکنید. </p> <h3>اشتباه رایج</h3> <p> بهینهسازی زودهنگام یا اضافه کردن Cache بدون شناخت Bottleneck. </p> <h3>چالش جلسه</h3> <p> یک Endpoint را تحلیل کنید و سه گلوگاه احتمالی آن را پیدا کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>
<div class='lesson-rich-content'> <h2>جلسه 15: پروژه نهایی؛ ساخت یک Web API واقعی</h2> <h3>تمرکز جلسه</h3> <p> یکپارچهسازی Routing، DI، DTO، EF Core، Validation، معماری، امنیت، Logging، تست و مستندسازی. </p> <h3>چرا این مبحث مهم است؟</h3> <p> پروژه نهایی مشخص میکند آیا میتوانید مفاهیم مختلف را به یک سیستم منسجم تبدیل کنید. </p> <h3>در عمل چه کار میکنیم؟</h3> <p> API مدیریت فروشگاه را از مدل داده تا احراز هویت، تست، مستندات و آمادهسازی انتشار کامل میکنید. </p> <h3>اشتباه رایج</h3> <p> ساخت پروژه فقط برای اینکه Endpointها پاسخ بدهند. </p> <h3>چالش جلسه</h3> <p> یک Web API کامل بسازید و قبل از انتشار، قرارداد، امنیت و سناریوهای خطا را بازبینی کنید. </p> <h3>ارتباط با پروژه نهایی</h3> <p> این مبحث در ادامه دوره در پروژه نهایی استفاده میشود. هدف این است که مفهوم جلسه فقط به یک مثال آموزشی محدود نماند و بتوانید آن را در یک مسئله واقعی به کار بگیرید. </p> </div>