【发布时间】:2011-08-06 22:31:58
【问题描述】:
因此,借助教程中的一些帮助,我设法将 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 对象返回会话。
会话提供者
public class SessionProvider : Provider<ISession>
{
protected override ISession CreateInstance(IContext context)
{
var unitOfWork = (UnitOfWork)context.Kernel.Get<IUnitOfWork>();
return unitOfWork.Session;
}
}
存储库在其构造函数中采用 ISession。但是我没有看到 UnitOfWork.Session 是如何传递给我的存储库的“会话”?
对理解这一点的任何帮助都会很棒。谢谢。
【问题讨论】:
标签: c# asp.net-mvc-2 dependency-injection ioc-container ninject