در این جلسه از آموزش ASP.NET Core به بررسی مدل (Models) و ریپازیتوری (Repository) در معماری MVC خواهیم پرداخت. همانگونه که قبلا اشاره کردیم، مدل (Models) به قسمت منطق برنامه (Business Logic) در معماری MVC اطلاق میگردد. در این قسمت به معرفی موجودیتهای برنامه (Entity) و ارتباط با پایگاهداده از طریق ریپازیتوری (Repository) خواهیم پرداخت.
مدل (Models) در معماری MVC چیست؟
Models به قسمتی از معماری MVC گفته میشود، که دربرگیرنده منطق برنامه (Business Logic) میباشد. در این قسمت برای هر یک از موجودیتهای اپلیکیشن یک کلاس که حاوی فیلدهای آن موجودیت باشد ایجاد میکنیم که به آن مدل (Model) گفته میشود.
شما میتوانید کلاس مربوط به مدل موجودیت (Class)، اینترفیس (Interface) و ریپازیتوری (Repository) را در هر قسمتی از Web App خود که تمایل دارید، ایجاد کنید. ولی جهت ایجاد نظم و ساختار فایل طبقه بندی شده، بهتر است این موارد در پوشه Models ایجاد گردد.
ایجاد مدل (Model) برای یک موجودیت (Entity)
ابتدا یک کلاس (Class) در پوشه Models ایجاد نماییدو سپس با توجه به فیلدهای مورد نیاز آن، موجودیت (Entity) و مدل (Model) خود را ایجاد کنید. ما در این دوره ی آموزشی قصد داریم، یک وب اپلیکیشن با قابلیت ذخیرهسازی مخارج روزانه را ایجاد نماییم. اولین موجودیت (Entity) مورد نیاز، جهت ذخیرهسازی این اطلاعات را Cost نامگذاری میکنیم که دارای پنج فیلد ID جهت ذخیره ایندکس و کلید اصلی، Date جهت ذخیره تاریخ پرداخت هزینه، Amount جهت ذخیره مبلغ هزینه، Category جهت دسته هزینه و Comment جهت ذخیره اطلاعات تکمیلی برای آن هزینه میباشد.
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Cost { public int ID { get; set; } public decimal Amount { get; set; } public DateTime Date { get; set; } public string Comment { get; set; } public string Category { get; set; } } |
جهت اضافه نمودن هر Property میتوانید از کلمه کلیدی prop و زدن دو بار کلید تب (Tab) استفاده نمایید.
اضافه نمودن ریپازیتوری (Repository) و اینترفیس (Interface)
ریپازیتوری (Repository) یا مخزن، به کلاسی گفته میشود که جهت انجام عملیات CRUD برای هر موجودیت میتوان ایجاد نمود. همچنین اینترفیس (Interface) جهت معرفی لیست متدهای ریپازیتوری ایجاد میگردد که از این طریق، میتوان Dependency Injection را پیادهسازی نمود که در جلسات آینده به معرفی آن خواهیم پرداخت. همانگونه که ذکر شد، ایجاد Repository و Interface الزامی نمیباشد، ولی برای داشتن وب اپلیکیشن با استاندارد بالا، قابلیت تامین و نگهداری و تست پذیری قابل قبول، ایجاد آنها توصیه میگردد.
ابتدا برای موجودیت Cost که قبلا ایجاد نمودیم یک Interface درون پوشه Models ایجاد میکنیم. این Interface در طول این دوره آموزشی، با توجه به نیازهای وب اپلیکشن، تکمیل میگردد.
1 2 3 4 5 6 7 8 |
public interface ICostRepository { Cost GetCostByID(int id); } |
سپس یک کلاس جهت ایجاد ریپازیتوری برای موجودیت Cost به وب اپلیکشن خود درون پوشه Models اضافه میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class StaticCostRepository : ICostRepository { private List<Cost> costs = new List<Cost> { new Cost {ID=1, Amount=100, Date=DateTime.Now, Category="Bill", Comment="Payment for Mobile bill"}, new Cost{ID=2, Category="Grocery", Date=DateTime.Now, Amount=40, Comment="Payment for buying milk and vegetables"}, new Cost{ID=2, Category="Grocery", Date=DateTime.Now, Amount=40, Comment="Payment for buying meat and chicken"}, }; public Cost GetCostByID(int id) { return costs.FirstOrDefault(c => c.ID == id); } } |
به طور کلی، جهت استفاده از Visual Studio IntelliSense در محلی مشخص شده با خط چین، میتوانید از کلید های ترکیبی Ctrl+.
و یا Alt + Enter
استفاده نمود.
چگونه از Repository در Controller استفاده نماییم؟
جهت استفاده از اینترفیس ایجاد شده، میبایست به روش زیر عمل نمود:
- ابتدا میبایست ریپازیتوری مورد نظر را برای اینترفیس خود در متد ConfigureServices از کلاس Startup مشخص نماییم.
1 2 3 4 5 |
services.AddSingleton<ICostRepository, StaticCostRepository>(); |
- سپس در کنترولر (Controller) مورد نظر، در قسمت Constructor اقدام به معرفی اینترفیس میکنیم.
1 2 3 4 5 6 7 8 9 10 11 |
public class CostController : Controller { public CostController(ICostRepository _costRepository) { } ... } |
- برای اینترفیس و ریپازیتوری خود، یک شئ Private ایجاد میکنیم تا در طول کنترلر در دسترس باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class CostController : Controller { private readonly ICostRepository costRepository; public CostController(ICostRepository _costRepository) { costRepository = _costRepository; } ... } |
- در اکشن متدهای کنترلر مورد نظر، از طریق شئ ایجاد شده به متدهای رپازیتوری دسترسی خواهیم داشت.
1 2 3 4 5 6 7 8 9 |
public IActionResult Detail() { var CostObject = costRepository.GetCostByID(1); return new ObjectResult(CostObject); } |
در این پروژه تا کنون فقط یک اینترفیس و ریپازیتوری ایجاد نمودیم و شاید این کار به ظاهر قابل درک نباشد، در حالی که بسیار سادهتر میتوان به داده دسترسی داشت و عملیات مختلف را بروی داده ها انجام داد. اما با ادامه پروژه و بررسی Dependency Injection اهمیت این موضوع بیش از پیش مشخص خواهد شد.
برای ایجاد Constructor میتوان از کلمه کلیدی ctor و زدن دوبار کلید تب (Tab) استفاده نمود.
در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام، یوتیوب و آپارات دنبال کنید و لیست کامل جلسات در این قسمت در دسترس شما میباشد.
دانلود اسلایدهای آموزشی این جلسه از اینجا