在Bind <t>()。ToMethod </t>中解析单例

时间:2012-12-07 14:43:16

标签: asp.net-mvc-4 ninject

Ninject 3与此代码的等效内容是什么:

Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<INHibernateSessionFactoryBuilder>()
            .GetSessionFactory()
            .OpenSession())
            .Using<OnePerRequestBehavior>();

我知道我可以使用InRequestScope代替Using<OnePerRequestBehavior>但是如何替换ctx.Kernel.Get<INHibernateSessionFactoryBuilder>? (INHibernateSessionFactoryBuilder是单身人士)

2 个答案:

答案 0 :(得分:4)

好的,只是为了澄清 - 因为这是在一个模块中,您仍然可以访问ctx.Kernel.Get<T>但是您需要向模块添加using Ninject;,因为Kernel.Get<T>被公开为扩展方法。

答案 1 :(得分:1)

好的,所以这里有适用于我的最终代码:

using Infrastructure.Data;
using NHibernate;
using Ninject;
using Ninject.Modules;
using Ninject.Web.Common;

namespace Infrastructure.DependencyResolution
{
    public class SessionModule : NinjectModule
    {
        public override void Load()
        {
            Bind<INHibernateSessionFactoryBuilder>().To<NHibernateSessionFactoryBuilder>().InSingletonScope();

            Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<INHibernateSessionFactoryBuilder>()
                .GetSessionFactory()
                .OpenSession())
                .InRequestScope();      
        }
    }
}

这个模块加载了Ninject引导程序,我可以使用NHibernate会话的存储库,而不需要在Web项目中使用NH引用...