【问题标题】:Ninject multiple modules注入多个模块
【发布时间】:2011-03-06 10:13:18
【问题描述】:

我最初不认为这会是一个问题,但随着我不断收到异常,我想我会在这里发帖,以防我是个白痴......

我有 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 模块在 Controller 模块之前。

我在上面做的事情有什么愚蠢的吗?

【问题讨论】:

  • 我是个十足的木偶,结果我的一个参数是错误的 sessionKey != sessionkey。虽然我知道 Ninject 可以推断参数,而不是我必须全部输入...

标签: asp.net-mvc-3 ninject-2


【解决方案1】:

假设:

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

【讨论】:

  • 你说得真好,我不知道 Ninject 可以自动推断参数,这很不错。我没有使用 NinjectHttpApplication 虽然我不喜欢我的 Http 东西被绑定到它,所以我使用 DependencyResolver 代替。会试一试,不过谢谢!
  • 试一试,得到“System.MissingMethodException:没有为此对象定义无参数构造函数。” ISessionManager 实现有一些构造函数注入,但这一切都在 NHibernate 模块中处理,我认为它不相关,因为它可能会使问题复杂化。
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多