تزریق وابستگی در MVC

یکشنبه 23 اسفند 1394

در این مقاله ضمن توضیح مختصر از IOC یا واگذاری کنترل به مفهوم تزریق وابستگی در mvc خواهیم پرداخت و در کنار آن یک نمونه ساده هم ایجاد خواهیم کرد .

تزریق وابستگی در 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>

پس از اجرای برنامه شکل زیر را خواهیم دید

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید