تزریق وابستگی یکی از نیازهای بسیار رایج توسعه نرم افزار است. چندین کانتینر Inversion of Control (IoC) برای دات نت وجود دارد که می توان از میان آنها انتخاب کرد (مانند Castle Windsor، Structure Map و Microsoft Unity، فقط به نام چند). Ninject یکی از جدیدترین ورودی ها در عرصه است، اما اکنون به اندازه کافی در نسخه 2.0 پایدار است.
Ninject یک چارچوب تزریق وابستگی سبک وزن برای برنامه های NET است. این به شما کمک می کند تا برنامه خود را به مجموعه ای از قطعات بسیار منسجم و با اتصال شل تقسیم کنید و سپس آنها را به روشی انعطاف پذیر به هم بچسبانید. با استفاده از Ninject برای پشتیبانی از معماری نرم افزار خود، نوشتن، استفاده مجدد، تست و اصلاح کد شما آسان تر می شود. در اینجا
می توانید اطلاعات بیشتری در مورد Ninject بخوانید . در اینجا چند ویژگی مهم Ninject آورده شده است:
- ارائه رابط روان
- سبک وزن (122 کیلوبایت، نسخه 3.0.015)
- سریعتر به دلیل تولید کد سبک
- قابل توسعه (ارائه پسوند برای MVC، WCF و موارد دیگر)
نحوه راه اندازی Ninject در یک برنامه
استفاده از Ninject در یک برنامه بسیار آسان و مستقیم است. فقط بسته را از NuGet Package Manager نصب کنید.
![راه اندازی Ninject در برنامه](https://www.c-sharpcorner.com/UploadFile/dacca2/implement-dependency-injection-using-ninject/Images/setup Ninject in application.jpg)
هنگامی که بسته را از Package Manager نصب می کنید، یک مرجع از اسمبلی زیر در برنامه شما ارائه می کند.
![مونتاژ](https://www.c-sharpcorner.com/UploadFile/dacca2/implement-dependency-injection-using-ninject/Images/assembly.jpg)
هنگامی که مشاهده کردید که اسمبلی وجود دارد، ما مجاز به استفاده از Ninject در برنامه خود هستیم. اگر علاقه مند به استفاده از Ninject در برنامه دیگری غیر از یک برنامه کنسول هستید، باید از چند DLL دیگر از NuGet Package Manager استفاده کنید. دو جزء اصلی Ninject به نامهای Modules و Kernel وجود دارد.
ماژول
ماژول ها اجزایی هستند که انواع را ثبت می کنند. ماژولها بهعنوان بخشهای مستقل یک برنامه کاربردی عمل میکنند که از اتصال تمام رابطها با پیادهسازی آن بخش مراقبت میکنند.
بنابراین، اگر ماژول ها را به طور عملی مورد بحث قرار دهیم، راهی برای اتصال یک کلاس به رابط مرتبط است. به عنوان مثال من یک رابط IService و یک کلاس Serivce دارم. با استفاده از Module، می توانم یک رابط IService را با کلاس Service پیوند دهم.
- public class TryModule : NinjectModule
- {
- public override void Load()
- {
- Bind<IWeapon>().To<Ninja>();
- }
- }
در این مثال یک رابط به نام IWeapon وجود دارد و من رابط را در Ninja متصل می کنم. دلیل آن این است که من رابط IWeapon را در کلاس Ninja پیاده سازی کرده ام.
Kernel
در Ninject، هسته مولفه ای است که همه چیز را کنترل می کند. ما میتوانیم مستقیماً اینترفیسها را با پیادهسازیها در هسته پیوند دهیم یا میتوانیم آنها را به صورت ماژولهای پیچیده شده ارسال کنیم. هر زمان که نیاز به اجرای رابط نقشهبرداری شده داشته باشیم، میتوانیم آن را بلافاصله از هسته دریافت کنیم. خود Ninject دارای یک هسته داخلی به نام StandardKernel است.
خوب، در اینجا یک نمونه از یک هسته است.
- Ninject.IKernel kernal = new StandardKernel();
- kernal.Bind<IWeapon>().To<Ninja>();
و ما باید تمام ماژول های خود را مانند بالا به هسته متصل کنیم.
خوب، بنابراین ما دو مفهوم اصلی را درک می کنیم و اکنون زمان اجرای Ninject در یک برنامه نمونه است. در این مثال ما یک نمونه برنامه، یک پروژه برنامه Console ایجاد می کنیم و خواهیم دید که چگونه Ninject برای پیاده سازی یک کانتینر ساده IoC استفاده می شود. به مثال زیر دقت کنید.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using Ninject;
- namespace Client
- {
- public interface IWeapon
- {
- void sord();
- }
- public class Ninja : IWeapon
- {
- public void sord()
- {
- Console.WriteLine("I am using Sord");
- }
- }
- public class sourav
- {
- IWeapon ObjWeapon = null;
- public sourav(IWeapon tmpWeapon)
- {
- this.ObjWeapon = tmpWeapon;
- }
- public void Attack()
- {
- this.ObjWeapon.sord();
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Ninject.IKernel kernal = new StandardKernel();
- kernal.Bind<IWeapon>().To<Ninja>();
- var instance = kernal.Get<sourav>();
- instance.Attack();
- Console.ReadLine();
- }
- }
- }
رابط IWeapon و کلاس Ninja بسیار ساده هستند، ما به تازگی تابع sord() را در رابط IWeapon تعریف کرده ایم و آن را در کلاس Ninja پیاده سازی کرده ایم، بدنه sord() خیلی ساده است.
اکنون، در ادامهی آنها، ما یک کلاس «سوراو» را پیادهسازی کردهایم (نام کلاس به طور هدفمند داده شده است، زیرا من میخواستم از کلاس به عنوان Ninja استفاده کنم).