2011-03-06 63 views
0

我不認爲這會是一個問題,本來,但我不斷收到異常以爲我會在這裏發佈櫃面IM是一個傻瓜...Ninject多個模塊

我有2個模塊班,一個建立了NHibernate和一個設置了MVC控制器,現在我的問題是,我有類似如下:

public class NHibernateModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ISessionManager>().To<SessionManager>(); 
    } 
} 

public class ControllerModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<SomeController>().ToSelf() 
          .WithConstructorArgument("sessionManager", Kernel.Get<ISessionManager>()); 
    } 
} 

每當我嘗試使用控制器,它只是彈了,告訴我,結合其出現故障的sessionManager說法。當我創建內核時,我確保列表中的控制器模塊之前有Nhibernate模塊。

有什麼立即愚蠢在什麼我在做什麼?

+0

我被共布偶,它結束了一個我的參數錯了sessionKey!= sessionkey。雖然我已經瞭解到Ninject可以推斷參數,而不是我必須全部輸出它們...... – Grofit 2011-03-06 13:08:49

回答

0

假設:

public class SomeController : Controller 
{ 
    private readonly ISessionManager _sessionManager; 
    public HomeController(ISessionManager sessionManager) 
    { 
     _sessionManager = sessionManager; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

以下應足以:

public class NHibernateModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ISessionManager>().To<SessionManager>(); 
    } 
} 

public class ControllerModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<SomeController>().ToSelf(); 
    } 
} 

和Global.asax中:

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

    protected override IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
     { 
      new NHibernateModule(), 
      new ControllerModule() 
     }; 

     return new StandardKernel(modules); 
    } 
} 
+0

你很有特色,我不知道Ninject可以自動推斷參數,這很漂亮。我不使用NinjectHttpApplication,雖然我不喜歡我的Http東西被綁定到它,所以即時使用DependencyResolver來代替。不過謝謝你試試這個試試吧! – Grofit 2011-03-06 11:55:46

+0

剛剛給了它並得到「System.MissingMethodException:沒有爲此對象定義的無參數構造函數」。 ISessionManager實現有一些構造器注入,但是這些都是在NHibernate模塊內部處理的,我並不認爲它相關,因爲它可能會使問題複雜化。 – Grofit 2011-03-06 11:58:51