2011-03-06 65 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