Как да внедрите DI в WebAPI с помощта на NInject

Инжектирането на зависимости е модел на софтуерен дизайн, който ви помага да изградите изпълними приложения в приложението си, използвайки свободно свързани, проверявани компоненти. Той елиминира твърдо кодираните зависимости между типовете и прави вашите типове по-лесни за изграждане, тестване и поддръжка във времето. Моделът за проектиране на IOC (Inversion of Control) гласи, че обектите не трябва да създават обекти, от които зависят, за да изпълняват някаква дейност.

Имате много IOC контейнери, които ви помагат в автоматичното създаване на екземпляри и управление на жизнения цикъл на обектите. Имайте предвид, че инжектирането на зависимост е подмножество на принципа на IOC. IOC контейнерите използват инжектиране на зависимост, за да инвертират потока от контрол.

Приготвяме се да започнем

За да започнете с това внедряване, създайте нов проект WebAPI в Visual Studio. След това инсталирайте необходимите пакети от NuGet, за да работите с NInject. Можете да инсталирате пакета Ninject.Web.WebApi.WebHost чрез NuGet Package Manager. Това от своя страна ще инсталира следните два пакета за вас.

Ninject.Web.WebApi

Ninject.Web.WebApi.WebHost

Инжектиране на зависимост с помощта на NInject

След като пакетът Ninject.Web.WebApi.WebHost бъде инсталиран успешно, файлът NInject.WebCommon.cs се създава автоматично в папката App_Start във вашия проект. Щеше да се генерира много шаблонния код - просто го игнорирайте и се обърнете към метода RegisterServices (). На пръв поглед ето как би изглеждал този метод.

private static void RegisterServices(IKernel kernel)

{

}

Ще трябва да напишете кода си в метода RegisterServices, за да регистрирате услугите или да инжектирате зависимостите. Ще се върнем към това по-късно в тази статия.

В този пример ще използваме инжектиране на конструктор - тип инжектиране на зависимост, при което една или повече зависимости се инжектират чрез конструктори. Другите два вида инжектиране на зависимост включват: инжектиране на сетер и инжектиране на интерфейс. Покрих това подробно в една от по-ранните си публикации.

Като следваща стъпка създайте нов контролер на име AuthorsController към създадения от вас проект WebAPI. Заменете кода по подразбиране на AuthorsController с този, даден по-долу.

public class AuthorsController : ApiController

    {

        private readonly IAuthorRepository repository;

        public AuthorsController(IAuthorRepository repository)

        {

            this.repository = repository;

        }

        public List Get()

        {

            return repository.GetAllAuthors();

        }

    }

AuthorsController съдържа справка само за четене на интерфейса на IAuthorRepository, конструктор на аргументи и метод за действие за получаване. Обърнете внимание, че AuthorsController използва конструктор за инжектиране на зависимостта, т.е. това е конструктор на аргументи, който приема препратка към интерфейса IAuthorRepository като параметър. Интерфейсът IAuthorRepository е реализиран от класа AuthorRepository. Ето как изглежда интерфейсът на IAuthorRepository.

public interface IAuthorRepository

    {

        List GetAllAuthors();

    }

Методът GetAllAuthors () се използва за връщане на списък с автори. Имената на авторите са кодирани твърдо. Класът AuthorRepository реализира метода GetAllAuthors, както е показано по-долу.

public class AuthorRepository : IAuthorRepository

    {

        public List GetAllAuthors()

        {

            List authors = new List();

            authors.Add("Joydip");

            authors.Add("Pete");

            authors.Add("Steve");

            return authors;

        }

    }

Регистриране на нашите услуги в Ninject

Тази стъпка е съвсем проста. Не забравяйте, че по-рано обсъждахме метода RegisterServices? Това принадлежи към статичния клас NinjectWebCommon във файла NinjectWebCommon.cs. Ето как можете да използвате метода RegisterServices за разрешаване на зависимостите.

private static void RegisterServices(IKernel kernel)

{

   kernel.Bind().To();   

И това е всичко, което трябва да направите. Ако видите грешки по време на изпълнение, свързани с NInject, това може да се дължи на ActivationException. За да го поправите, трябва да инсталирате най-новата версия на пакета Ninject.Web.WebApi. Просто надстройте Ninject.Web.WebApi отново, прекомпилирайте и след това изпълнете приложението си отново.

Можете да разгледате тази публикация за допълнителна информация за това как можем да използваме NInject с WebAPI.