我刚开始用.NET编程,我在实现dependency injection (using Ninject)
方面遇到了一些问题。
我正在创建某种餐饮应用程序,用户可以浏览城镇,在城镇浏览餐馆和餐馆浏览食物。
我正在使用UnitOfWork和存储库模式,例如我通过id访问城镇:
_unitOfWork.TownRepository.GetByID(id);
现在我开始将服务应用到应用程序中,我遇到了对dependency injection
的需求。
我创建了ITownService
,IRestaurantService
和IFoodService
(因为我TownRepository
,RestaurantRepository
和FoodRepository
在{{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
而非IService
,ITownService
和IRestaurantService
,我已在IFoodService
,TownService
和{{1}中继承了这些内容。或者这样可以吗?
绑定时我需要绑定什么?
RestaurantService
这样的东西?
简而言之 - 我需要用FoodService
添加依赖注入吗?
我真的遇到了这个问题,需要帮助。
非常感谢前进。
答案 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>();
}