Интенсивность зависимостей .NET MVC с Ninject

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

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

Я использую шаблон UnitOfWork и репозитория, где, например, я обращаюсь к городу по id следующим образом:

_unitOfWork.TownRepository.GetByID(id);

Теперь я начал внедрять службы в приложение, и я столкнулся с необходимостью для dependency injection.

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

Пример оформления 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, но они должны быть похожими, конечно, с некоторыми дополнительными методами 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?

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

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

Ответ 1

В консоли диспетчера пакетов выполните следующую команду:

Install-package Ninject.MVC3

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

Если вы посмотрите на нижнюю часть, существует метод RegisterServices.

Вы просто добавляете код из своего вопроса там i.e.

    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>();
    }