将Ninject绑定到子控制器 - 错误:未返回控制器

时间:2011-05-13 17:42:07

标签: asp.net-mvc ninject

我正在尝试将一些存储库绑定到子控制器,但我继续收到错误,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'的控制器。我错过了什么?

提前致谢!

2 个答案:

答案 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)。