تزریق وابستگی ها (Dependency Injection) با استفاده از Windsor در mvc

یکشنبه 24 آبان 1394

در این مقاله قصد داریم نشان دهیم چگونه می توان از Windsor برای تزریق وابستگی یا وارونگی کنترل در ASP.net MVC استفاده کرد. Windsor یکی از کتابخانه هایی است که برای تزریق وابستگی استفاده می شود.

تزریق وابستگی ها (Dependency Injection) با استفاده از Windsor در mvc

 در این مقاله قصد داریم نشان دهیم چگونه می توان از Windsor  برای تزریق وابستگی یا وارونگی کنترل در ASP.net MVC استفاده کرد. Windsor  یکی از کتابخانه هایی است که برای تزریق وابستگی استفاده می شود.

اگر با تزریق وابستگی ها آشنایی ندارید به این قسمت مراجعه کنید.

یک پروژه MVC ایجاد کرده و کتابخانه windsor را در آن اضافه میکنیم. ساده ترین راه برای اضافه کردن کتابخانه  Windsor  استفاده از NuGet Pakage Installer  است. بر روی reference کلیک راست کرده و Manage Nuget Pakage  را انتخاب کنید.

 

در پنجره باز شده Windsore MVC را جستجو کنید ، سپس Castle Windsor Bootstrapper را نصب کنید.

بعد از پایان نصب ، 4 فایل به پروژه استفاده می شوند:

1. در App_Start فایل ContainerBootstrapper.cs

2. در App_Start فایل WindsorActivator.cs

3. در Plumbing فایل WindsorControllerFactory.cs

4. در Installers فایل ControllersInstaller.cs

سه فایل اول توسط کتابخانه windsor  برای پیکربندی کنترلر استفاده می شوند. فایل چهارم برای گسترش رفتار کنترلر توسط کتابخانه استفاده می شود. شما رابط و پیاده سازی کلاس ها را در پوشه Installer  پیکربندی میکنید. اما قبل از آن لازم است تا آنها را ایجاد کنیم . برای این کار رابط و کلاس ToDo را در Models با استفاده از کدهای زیر ایجاد میکنیم.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WindsorMvcDemo.Models
{
    public class ToDo
    {
        public string Title { get; set; }
        public DateTime Date { get; set; }
        public string Comment { get; set; }
    }

    public interface ToDoListService
    {
        IEnumerable<ToDo> GetToDoList();
    }

    public class ToDoListServiceImpl : ToDoListService
    {
        public IEnumerable<ToDo> GetToDoList()
        {
            return new List<ToDo>
            {
                new ToDo
                {
                    Title = "Meeting with client",
                    Comment = "Meet at the office on 08:00AM",
                    Date = DateTime.Today
                },
                new ToDo
                {
                    Title = "Lunch with Girlfriend",
                    Comment = "At restaurant near the office",
                    Date = DateTime.Today
                },
                new ToDo
                {
                    Title = "Go to dentist",
                    Comment = "Scheduled Visit to dentist",
                    Date = DateTime.Today.AddDays(2)
                }
            };
        }
    }
}

برای نمایش لیستی از کلاس ToDo یک کنترلر با نام ToDoList  ایجاد میکنیم.

public class ToDoListController : Controller
{
    private ToDoListService toDoListService;

    public ToDoListController(ToDoListService service)
    {
        this.toDoListService = service;
    }

    // GET: ToDoList
    public ActionResult Index()
    {
        var model = toDoListService.GetToDoList();

        return View(model);
    }
}

پیکر بندی وابستگی

در کنترلر بالا توجه داشته باشید که سازنده نیاز به پارامتر ToDoListService دارد. چگونه می توانیم پارامتری را ارسال کنیم اگر نتوانیم نمونه ای از کلاس کنترلر داشته باشیم؟ در اینجا windsor  به کمک ما می آید. در ابتدا باید به وسیله ثبت رابط و خدمات کلاس به Windsor Container وابستگی را پیاده سازی کنیم. زمانی که برنامه شروع به کا رکرد، Windsor  تمام کلاس ها را جستجو میکند که رابط و نمونه ای از کلاس  را پیاده سازی و متد Install را فراخوانی میکند.

کد زیر برای ثبت رابط و پیاده سازی استفاده می شود :

public class ServiceInstaller : IWindsorInstaller
{
    public void Install(Castle.Windsor.IWindsorContainer container,
	Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.Register(
            Component
                .For<ToDoListService>()
                .ImplementedBy<todolistserviceimpl>()
                .LifestyleTransient());
        }
    }
}

 

قدم بعدی ایجاد View  برای کنترلر TodoList  است. که با کلیک بر روی index  می توانیم آن را اضافه کنیم .

@model IEnumerable<MVC_dependency.Models.ToDo>

@{
    ViewBag.Title = "Index";
}

<br/>
<br/>
<br/>

<h3>برنامه ریزی کارها</h3>

<p>
    @Html.ActionLink("افزودن", "Create")
</p>
<table class="table">
    <tr >
        

        <th>
            عنوان
        </th>
        <th>
            تاریخ
        </th>
        <th>
            توضیحات
        </th>
    </tr>

    @foreach (var item in Model)
    {
       
        <tr >
        
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
           <td>
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Comment)
            </td>
        </tr>
    }

</table>

 

نتیجه به صورت زیر می باشد:

 

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

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

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

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

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