Таким образом, используя некоторую помощь из учебников, мне удалось подключить сеанс Nhibernate к моим репозиториям и репозиториям к контроллерам с помощью Ninject.Тем не менее, есть одна особенность установки, которую я не осознаю «автоматики» того, что делает Ninject, и надеялся, что кто-то может объяснить.
Ниже мой Ninject ModuleRepository , который наследуется отNinjectModule, который выполняет всю привязку.
public class ModuleRepository : NinjectModule
{
public override void Load()
{
var helper = new NHibernateHelper(ConfigurationManager.ConnectionStrings[Environment.MachineName].ConnectionString);
Bind<ISessionFactory>().ToConstant(helper.SessionFactory)
.InSingletonScope();
Bind<IUnitOfWork>().To<UnitOfWork>()
.InRequestScope();
Bind<ISession>().ToProvider<SessionProvider>()
.InRequestScope();
Bind<IRepository<Product>>().To<ProductRepository>();
Bind<IRepository<Category>>().To<CategoryRepository>();
}
}
Вот класс 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<ISession>
{
protected override ISession CreateInstance(IContext context)
{
var unitOfWork = (UnitOfWork)context.Kernel.Get<IUnitOfWork>();
return unitOfWork.Session;
}
}
Репозитории принимают ISessionв их конструкторе.Но чего я не вижу, так это того, что UnitOfWork.Session - это «сессия», которая передается в мои репозитории?
Любая помощь в понимании этого была бы великолепна.Спасибо.