2014-02-03 3 views
11

Я только что начал программирование в .NET, и у меня возникли проблемы с реализацией dependency injection (using Ninject).Интенсивность зависимостей .NET MVC с Ninject

Я создаю какое-то приложение для общественного питания, где пользователь может просматривать города, в городах, где просматривают рестораны и в ресторанах просматривают еду.

Я использую UnitOfWork и репозиторий шаблон, где, например, получить доступ к городу по идентификатору, как это:

_unitOfWork.TownRepository.GetByID(id); 

Сейчас я приступил к реализации услуг в приложение, и я столкнулся с необходимостью dependency injection.

Я создал ITownService, IRestaurantService и IFoodService (так как я TownRepository, RestaurantRepository и FoodRepository в моем UnitOfWork).

Sample вид TownService:

public class TownService : ITownService 
    { 
     // initialize UnitOfWork 
     private IUnitOfWork _unitOfWork; 

     public TownService() 
      : this(new UnitOfWork()) 
     { 
     } 

     public TownService(IUnitOfWork unitOfWork) 
     { 
      _unitOfWork = unitOfWork; 
     } 

     public Town GetByID(object id) 
     { 
      return _unitOfWork.TownRepository.GetByID(id); 
     } 

     public IEnumerable<Town> GetAll() 
     { 
      return _unitOfWork.TownRepository.Get(); 
     } 

     public bool Insert(Town town) 
     { 
      // validation logic 
      if (!ValidateTown(town)) 
       return false; 

      try 
      { 
       _unitOfWork.TownRepository.Insert(town); 
       _unitOfWork.Save(); 
      } 
      catch 
      { 
       return false; 
      } 

      return true; 
     } 

     public bool Delete(object id) 
     { 
      try 
      { 
       _unitOfWork.TownRepository.Delete(id); 
       _unitOfWork.Save(); 
      } 
      catch 
      { 
       return false; 
      } 

      return true; 
     } 

     public bool Update(Town townToUpdate) 
     { 
      // validation logic 
      if (!ValidateTown(townToUpdate)) 
       return false; 

      try 
      { 
       _unitOfWork.TownRepository.Update(townToUpdate); 
       _unitOfWork.Save(); 
      } 
      catch 
      { 
       return false; 
      } 

      return true; 
     } 
    } 

Я не выполнил FoodService и RestaurantService пока нет, но они должны быть похожи с конечно некоторые additinal методы exepct это, что у меня есть. Например, в RestaurantService у меня может быть public Restaurant GetRestaurantsInTown(Town town){} или что-то в этом роде.

Надеюсь, что у вас есть ощущение приложения. Теперь вернемся к Ninject.

В моей TownController я бы что-то вроде этого:

public class TownController : Controller 
    { 

     private ITownService _townService; 

     public TownController(ITownService townService) 
     { 
      _townService = townService; 
     } 
    } 

Похожие бы для RestaurantController и FoodController конечно просто конструктор инъекционного.

Как использовать Ninject в таком примере? Нужен ли мне какой-то глобальный IService, а не ITownService, IRestaurantService и IFoodService, которые я бы унаследовал в TownService, RestaurantService и FoodService, или это нормально?

При привязке, что мне нужно для привязки?

kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 
kernel.Bind<ITownService>().To<TownService>(); 
kernel.Bind<IRestaurantService>().To<RestaurantService>(); 
kernel.Bind<IFoodService>().To<TownService>(); 

Что-то вроде этого?

Вкратце - что мне нужно для добавления инъекции зависимостей с Ninject?

У меня действительно есть проблемы с этим и вам нужна помощь.

Большое спасибо вперёд.

+0

Привет, В настоящее время Как вы определили свой конструктор в контроллере? в приведенном выше примере вы передаете только «ITownService», что насчет 'IRestaurantService' и' IFoodService'? как вы создаете переменную? –

ответ

17

От менеджера пакетов консоли запустить эту команду:

Install-package Ninject.MVC3 

Это добавит класс App_Start/NinjectWebCommon.cs

Если посмотреть вблизи дна есть метод RegisterServices.

Вы просто добавить код из вашего вопроса там есть

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 
     kernel.Bind<ITownService>().To<TownService>(); 
     kernel.Bind<IRestaurantService>().To<RestaurantService>(); 
     kernel.Bind<IFoodService>().To<TownService>(); 
    } 
+0

Это все, что нужно? –

+0

@ ŽeljaHuber Да, это самый быстрый способ начать работу. Иногда, если ваши проекты становятся крупными, люди предпочитают разделить активаторов на свой собственный проект. Вы все нормально работали? – hutchonoid

+0

Да, это дало мне большое начало, благодаря большому счету, по-прежнему немного погубило, как я могу или не могу изменить свой сервисный уровень, но я думаю, что собираюсь идти этим путем и реализовать Ninject, как вы писали. Еще раз спасибо. –

Смежные вопросы