5

什么是此代码的 Ninject 3 等效项:

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

我知道我可以使用InRequestScopeUsing<OnePerRequestBehavior>但如何替换ctx.Kernel.Get<INHibernateSessionFactoryBuilder>?(INHibernateSessionFactoryBuilder是单例)

4

2 回答 2

4

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

于 2012-12-07T15:48:15.043 回答
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...

于 2012-12-07T16:23:10.333 回答