تزریق وابستگی با استفاده از Ninject

شنبه 8 اسفند 1394

در این مقاله می خواهیم در مورد dependency injection با استفاده از ninject در asp.net mvc صحبت نماییم، و یک مثال ساده هم برای آن تعریف نماییم.

تزریق وابستگی با استفاده از Ninject

در ابتدا در مورد design pattern و چگونگی پیاده سازی dependency injection با استفاده از microsoft unity توضیح می دهیم.

می توانید بعضی از design pattern ها را در این لینک ببینید.

قبل از ادامه دادن به این مقاله ابتدا مقاله ی تزریق وابستگی با استفاده از Microsoft Unity را مطالعه نمایید.

اجازه دهید ابتدا در مورد dependency injection توضیح دهیم.

تزریق وابستگی یک تکنیک برای توسعه ی یک برنامه ی کاربردی در یک راه مستقل است، مستقل به این معنا که هر ماژول از نرم افزار باید منحصر به فرد باشد و نباید بر ماژول های دیگر بستگی داشته باشد.

حالا می خواهیم در مورد Tightly Coupled و Loosely Coupled توضیحاتی را بیان کنیم:

Tight Coupling:

این به این معنا است که دو کلاس یا دو ماژول کاملا وابسته به یکدیگر هستند، که با تغییر دادن یک کلاس یا شی ممکن است منجر به تغییر در کلاس های دیگر باشد، زمانی که ما یک شی از یک کلاس تعریف می نماییم و آن را در کلاس دیگر تعریف می کنیم، این دو کلاس به هم دیگر وابسته هستند یا به عبارت دیگر Tight Coupling هستند.

Loose Coupling:

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

حالا می خواهیم در مورد پیاده سازی dependency injection با استفاده از ninject صحبت نماییم:

ninject یک dependency فوق العاده سبک برای برنامه های دات نت است، این برنامه از روش Loose Coupling استفاده می نماید و ابتدا مجموعه را به واحد های منسجم و مستقل تقسیم می نماید و سپس آن ها را در کنار یکدیگر قرار می دهد.

با استفاده از ninject کد خود را آسان تر با انعطاف تر قابل تست و تغییر و هم چنین استفاده ی مجدد از کد را می توانید داشته باشید.

ابتدا یک پروژه ی جدید ایجاد نمایید به صورت زیر:

پروژه ی خود را از نوع mvc انتخاب نمایید:

یک کلاس employee و یک interface می سازید به صورت زیر:

حالا manage nuget package را باز کنید و Ninject.Mvc3 را جستجو نمایید.

بعد از اضافه کردن ما 3 assemblies در refrence خود پیدا می کنیم حالا اگر پوشه ی App_start خود را چک کنیم کلاس NinjectWebCommon.cs را مشاهده می کنیم.

داخل interface خود متد زیر را اضافه می نماییم.

public interface Iemployee  
{  
    string SaveData();  
         
} 

داخل کلاس employee بروید و متد زیر را پیاده سازی نمایید و پیغام زیر را به کد خود اضافه کنید:

public class Employee:Iemployee  
{  
    public string SaveData()  
    {  
        return "Data Saved....";  
             
    }  
}

داخل کلاس Ninjectwebcommon.cs در App_Start شوید و متد RegisterServices خط زیر را به آن اضافه نمایید:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(DependencyInjection.App_Start.NinjectWebCommon), "Start")]  
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(DependencyInjection.App_Start.NinjectWebCommon), "Stop")]  
  
namespace DependencyInjection.App_Start  
{  
    using System;  
    using System.Web;  
  
    using Microsoft.Web.Infrastructure.DynamicModuleHelper;  
  
    using Ninject;  
    using Ninject.Web.Common;  
  
    public static class NinjectWebCommon   
    {  
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();  
  
        /// <summary>  
        /// Starts the application  
        /// </summary>  
        public static void Start()   
        {  
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));  
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));  
            bootstrapper.Initialize(CreateKernel);  
        }  
          
        /// <summary>  
        /// Stops the application.  
        /// </summary>  
        public static void Stop()  
        {  
            bootstrapper.ShutDown();  
        }  
          
        /// <summary>  
        /// Creates the kernel that will manage your application.  
        /// </summary>  
        /// <returns>The created kernel.</returns>  
        private static IKernel CreateKernel()  
        {  
            var kernel = new StandardKernel();  
            try  
            {  
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);  
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();  
  
                RegisterServices(kernel);  
                return kernel;  
            }  
            catch  
            {  
                kernel.Dispose();  
                throw;  
            }  
        }  
  
        /// <summary>  
        /// Load your modules or register your services here!  
        /// </summary>  
        /// <param name="kernel">The kernel.</param>  
        private static void RegisterServices(IKernel kernel)  
        {  
            kernel.Bind<Iemployee>().To<DependencyInjection.Employee>().InRequestScope();  
              
        }          
    }  
} 

زمانی که ما یک شی از کلاسی را درست می نماییم، و آن شی را در کلاس دیگری صدا می زنیم این دو کلاس به هم وابسته هستند، بنابر این هدف ما اینجا این است که بدون ایجاد هر گونه instance یک متدی را داخل کلاس تعریف کنیم.

در HomeController یک سازنده ایجاد نمایید و به کد خود به صورت زیر اضافه می کنیم:

    public class HomeController : Controller  
    {  
        Iemployee iemployee;  
        public HomeController(Iemployee _iemployee)  
        {  
            iemployee = _iemployee;  

        }  
    }

بنابر این با درست کردن یک سازنده و ارسال سازنده ما اینجا یک Constructor Injection ایجاد کردیم.

حالا وقتی شما می خواهید به آن دسترسی داشته باشید برای دسترسی به متد کلاس employee می توانید متد را در یک action دیگر تعریف نمایید.

public ActionResult Index()  
{  
    string result = iemployee.SaveData();  
    return Content(result);  
} 

زمانی که اجرا بگیریم خروجی به صورت زیر خواهد بود:

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

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

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

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

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