2011-05-13 70 views
2

我試圖將一些存儲庫綁定到子控制器,但我一直在獲取錯誤,NinjectControllerFactory'沒有返回名稱'足球'的控制器。綁定Ninject到子控制器 - 錯誤:沒有返回控制器

基本控制器:

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

現在,當我打本地主機/足球/支球隊,我得到一個錯誤,指出NinjectControllerFactory沒有返回名爲'足球'的控制器。我錯過了什麼?

在此先感謝! 。

回答

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); 
+0

不知道我能做到這一點,因爲TeamRepository是一個基類嚴格鍵入... – keeg 2011-05-13 21:18:56

+0

沒關係,我只需要使視圖通用,這將完全工作 – keeg 2011-05-13 21:52:16

1

在您創建的控制器工廠中,您是否還有以下方法(或類似方法)來替換默認控制器工廠?

protected override IController GetControllerInstance(RequestContext context, Type controllerType) { 
    if (controllerType == null) return null; 

    return ((IController)_kernel.Get(controllerType)); 
} 

_kernel是控制器工廠(實現IKernel)的一個私有成員變量。

+0

是的,我編輯的問題,因此需要反映這種 – keeg 2011-05-13 17:57:20