我正在尝试将一些存储库绑定到子控制器,但我继续收到错误,NinjectControllerFactory'没有返回名为'soccer'的控制器。
基础控制器:
public class TeamController<T> : Controller
{
protected readonly ITeamRepository<T> TeamRepository;
public TeamController(ITeamRepository<T> teamRepository)
{
TeamRepository = teamRepository;
}
public ViewResult Teams(string viewName, string masterName, object model)
{
return View("~/Views/Teams.aspx", TeamRepository.Team.ToList());
}
}
然后是足球控制员:
public class SoccerController<T> : TeamController<T> where T : class
{
public SoccerController(ITeamRepository<T> teamRepository) : base(teamRepository)
{
}
}
Ninject:
public class NinjectControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel = new StandardKernel(new MyService());
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType == null) return null;
return (IController) _kernel.Get(controllerType);
}
private class MyService : NinjectModule
{
public override void Load()
{
Bind<ITeamRepository<SoccerTeam>>().To<TeamRepository<SoccerTeam>>()
.WhenInjectedInto(typeof(SoccerController<SoccerTeam>))
.WithConstructorArgument("connectionString",
ConfigurationManager.ConnectionStrings["dbCon"].ConnectionString);
}
}
}
现在当我点击localhost / soccer / teams时,我收到一条错误,指出NinjectControllerFactory没有返回名为'soccer'的控制器。我错过了什么?
提前致谢!
答案 0 :(得分:4)
你想:
public class SoccerController : TeamController<SoccerTeam>
{
public SoccerController(ITeamRepository<SoccerTeam> teamRepository) : base(teamRepository)
{
}
}
和
Bind(typeof(ITeamRepository<>)).To(typeof(TeamRepository<>))
.WithConstructorArgument("connectionString",
ConfigurationManager.ConnectionStrings["dbCon"].ConnectionString);
答案 1 :(得分:1)
您在创建的控制器工厂中是否还有以下方法(或类似的东西)来替换默认的控制器工厂?
protected override IController GetControllerInstance(RequestContext context, Type controllerType) {
if (controllerType == null) return null;
return ((IController)_kernel.Get(controllerType));
}
_kernel
是该控制器工厂的私有成员变量(实现IKernel
)。