¿Necesita ayuda para comprender cómo Ninject está obteniendo una instancia de Nhibernate SessionFactory en UnitOfWork?

Así que, gracias a la ayuda de los tutoriales, logré conectar una sesión de Nhibernate a mis repositorys y mis repositorys a mis controladores utilizando Ninject. Sin embargo, hay una parte de la configuración que no estoy captando el “automágico” de lo que Ninject está haciendo y esperaba que alguien pudiera explicar.

A continuación se encuentra mi Ninject ModuleRepository que se hereda de NinjectModule que hace todo el enlace.

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

Aquí está la clase 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(); } } 

Así que entiendo que estamos creando una instancia de instancia única única del objeto que crea una SessionFactory de Nhibernate. A continuación, se encuentra la clase SessionProvider que devuelve la sesión del objeto UnitOfWork que envuelve cada unidad de trabajo en una transacción.

Proveedor de sesión

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

Los Repositorios toman una sesión en su constructor. ¿Pero lo que no estoy viendo es cómo UnitOfWork.Session es la “sesión” que pasa a mis repositorys?

Cualquier ayuda para entender esto sería genial. Gracias.

La unión mediante:

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

establece que debe mantener el scope de la solicitud. Eso significa que Ninject almacenará en caché todas las solicitudes de ISession durante toda la HttpRequest, por lo que todas las clases que se inyecten (o obtengan explícitamente una instancia) usarán la misma instancia de ISession. En su configuración, lo mismo ocurre con IUnitOfWork.

Consulte esta publicación de Nate Kohari para obtener descripciones de los diferentes objetos de scope en Ninject.