使用Ninject进行.NET MVC依赖注入

时间:2014-02-03 10:27:40

标签: c# asp.net asp.net-mvc dependency-injection ninject

我刚开始用.NET编程,我在实现dependency injection (using Ninject)方面遇到了一些问题。

我正在创建某种餐饮应用程序,用户可以浏览城镇,在城镇浏览餐馆和餐馆浏览食物。

我正在使用UnitOfWork和存储库模式,例如我通过id访问城镇:

_unitOfWork.TownRepository.GetByID(id);

现在我开始将服务应用到应用程序中,我遇到了对dependency injection的需求。

我创建了ITownServiceIRestaurantServiceIFoodService(因为我TownRepositoryRestaurantRepositoryFoodRepository在{{1} }})。

TownService的示例外观:

UnitOfWork

我还没有实现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我可能有RestaurantService或类似的东西。

我希望你有一点应用的感觉。现在回到public Restaurant GetRestaurantsInTown(Town town){}

在我的Ninject我会有这样的事情:

TownController

类似于 public class TownController : Controller { private ITownService _townService; public TownController(ITownService townService) { _townService = townService; } } RestaurantController当然只是构造函数注入。

如何在此示例中使用FoodController?我是否需要一些全球Ninject而非IServiceITownServiceIRestaurantService,我已在IFoodServiceTownService和{{1}中继承了这些内容。或者这样可以吗?

绑定时我需要绑定什么?

RestaurantService

这样的东西?

简而言之 - 我需要用FoodService添加依赖注入吗?

我真的遇到了这个问题,需要帮助。

非常感谢前进。

1 个答案:

答案 0 :(得分: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>();
    }