需要帮助了解Ninject如何将Nhibernate SessionFactory实例添加到UnitOfWork中?

因此,使用教程中的一些帮助,我已经设法使用Ninject将Nhibernate会话连接到我的存储库和我的存储库到我的控制器。 然而,有一个设置,我没有理解Ninject正在做的“自动化”,并希望有人可以解释。

下面是我的Ninject ModuleRepository ,它inheritance自NinjectModule,它执行所有绑定。

public class ModuleRepository : NinjectModule { public override void Load() { var helper = new NHibernateHelper(ConfigurationManager.ConnectionStrings[Environment.MachineName].ConnectionString); Bind().ToConstant(helper.SessionFactory) .InSingletonScope(); Bind().To() .InRequestScope(); Bind().ToProvider() .InRequestScope(); Bind<IRepository>().To(); Bind<IRepository>().To(); } } 

这是UnitOfWork类

 public class UnitOfWork : IUnitOfWork { private readonly ISessionFactory _sessionFactory; private readonly ITransaction _transaction; public ISession Session { get; private set; } public UnitOfWork(ISessionFactory sessionFactory) { _sessionFactory = sessionFactory; //Open Session Session = _sessionFactory.OpenSession(); Session.FlushMode = FlushMode.Auto; _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted); } public void Commit() { if (!_transaction.IsActive) throw new InvalidOperationException("There is no active Transaction"); _transaction.Commit(); } public void Rollback() { if (_transaction.IsActive) _transaction.Rollback(); } //Close open session public void Dispose() { Session.Close(); } } 

所以我理解我们正在创建一个创建Nhibernate SessionFactory的对象的单个实例常量实例。 下面是SessionProvider类,它从UnitOfWork对象返回会话,该对象包装事务中的每个工作单元。

SessionProvider

 public class SessionProvider : Provider { protected override ISession CreateInstance(IContext context) { var unitOfWork = (UnitOfWork)context.Kernel.Get(); return unitOfWork.Session; } } 

存储库在其构造函数中使用ISession。 但我没有看到UnitOfWork.Session是如何传递给我的存储库的“会话”?

理解这一点的任何帮助都会很棒。 谢谢。

绑定使用:

 Bind().ToProvider().InRequestScope(); 

声明它应该保持请求范围。 这意味着Ninject将在整个HttpRequest期间缓存所有ISession请求 – 因此注入(或显式获取实例)的所有类将使用相同的ISession实例。 在您的配置中,IUnitOfWork也是如此。

有关Ninject中不同范围对象的描述,请参阅Nate Kohari的这篇文章 。