تزریق وابستگی در MVC
یکشنبه 23 اسفند 1394در این مقاله ضمن توضیح مختصر از IOC یا واگذاری کنترل به مفهوم تزریق وابستگی در mvc خواهیم پرداخت و در کنار آن یک نمونه ساده هم ایجاد خواهیم کرد .
در حالت سنتی و عدم استفاده از تزریق وابستگی ، بین کلاس های برنامه اتصالات مستقیم وجود دارد و با new کردن آنها این کار را انجام می دهیم .
اساس کار تزریق وابستگی بر اینترفیس استوار است .برای هر کلاسی که در سیستم دارید و می خواهید از آن استفاده کنید ابتدا باید اینترفیس آن را تعریف کنید .و بعد کلاس خود را با پیاده سازی این اینترفیس بسازید.
برای استفاده از این کلاس هم باید از Constructor Injection و یا Property Injection استفاده کنید تا کلاسی که قصد استفاده از آن را دارید معرفی کنید .
حال قبل از شروع بحث اصلی کمی راجع به مفاهیم پایه ای تر صحبت می کنیم .
IOC چیست ؟ این کلمه مخفف عبارت Inversion Of Control و با ترجمه واگذاری کنترل و یا مسئولیت است .IOC ارتباط بسیار نزدیکی با تزریق وابستگی دارد .این دو مفهوم الگوهای طراحی ایی هستند که با کاهش وابستگی بین اجزا مختلف ، کار نمونه گیری از کلاس ها را اتوماتیک می کنند
IoC Container، فریم ورکی است برای انجام تزریق وابستگیها. در این فریم ورک امکان تنظیم اولیه وابستگیهای سیستم وجود دارد. برای مثال زمانیکه برنامه از یک IoC Container، نوع اینترفیس خاصی را درخواست میکند، این فریم ورک با توجه به تنظیمات اولیهاش، کلاسی مشخص را بازگشت خواهد داد.وقتی از ioc در برنامه خود استفاده می کنید مراحل مختلفی روی می دهد .اول در برنامه یک شی مشخص را درخواست می کنیم .IOC به لیست اشیا خود نگاه می کند و اگر یک چنین شی ایی داشت نمونه سازی می کند و شی را تحویل برنامه می دهد .
وقتی نمونه از شی ساخته می شود وابستگی های آن هم نمونه سازی می شوند .اگر وابسته ها هم خودشان وابستگی داشته باشند این نمونه سازی از وابسته های آنها هم صورت می گیرد.
بعد از این توضیح کوتاه به سراغ کار عملی می رویم .ابتدا یک پروژه mvc از نوع empty ایجاد می کنیم .
در داخل پوشه مدل خود ابتدا یک کلاس Customer به صورت زیر ایجاد می کنیم .
public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
یک اینترفیسی به نام ICustomerRepository ایجاد می کنیم .در داخل این اینترفیس فقط یک متد وجود دارد .همان طور که می دانید اینترفیس هیچ پیاده سازی ایی ندارد و تنها در آن نام پراپرتی ها و متد ها ذکر می شوند.
public interface ICustomerRepository { List<Customer> GetCustomers(); }
در همین پوشه مدل یک کلاس دیگر به نام CustomerRepository به شرح زیر ایجاد می کنیم .
class CustomerRepository : ICustomerRepository { public List<Customer> GetCustomers() { var customers = new List<Customer> { new Customer{Id=1,FirstName = "سمیه", LastName = "مهاجرانی"}, new Customer{Id=2,FirstName = "ثنا",LastName = "تهرانی"} }; return customers; } }
همان طور که دیدید این کلاس اینترفیس ICustomerRepository را پیاده سازی کرده است واز آن ارث بری دارد .
یک کنترلر جدید به نام Customer ایجاد می کنیم .در داخل این کنترلر و در اکشن Index کدهای زیر را می نویسیم .
public class CustomerController : Controller { // GET: Customer public ActionResult Index() { CustomerRepository cus = new CustomerRepository(); var customer=cus.GetCustomers(); return View(customer); } }
کدهای داخل view به صورت زیر است
@model IEnumerable<MVCDISimpleInjector.Models.Customer> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("افزودن مورد جدید", "Create") </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.FirstName) </th> <th> @Html.DisplayNameFor(model => model.LastName) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.FirstName) </td> <td> @Html.DisplayFor(modelItem => item.LastName) </td> <td> @Html.ActionLink("ویرایش", "Edit", new { id=item.Id }) | @Html.ActionLink("جزئیات", "Details", new { id=item.Id }) | @Html.ActionLink("حذف", "Delete", new { id=item.Id }) </td> </tr> } </table>
پس از اجرای برنامه شکل زیر را خواهیم دید
- ASP.net MVC
- 4k بازدید
- 8 تشکر