gpt4 book ai didi

c# - 需要帮助了解 Ninject 如何将 Nhibernate SessionFactory 实例放入 UnitOfWork 中?

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:47 25 4
gpt4 key购买 nike

因此,借助教程中的一些帮助,我成功地使用 Ninject 将 Nhibernate session 连接到我的存储库,并将我的存储库连接到我的 Controller 。然而,有一个设置我没有掌握 Ninject 正在做的事情的“自动魔法”,希望有人能解释一下。

下面是我的 Ninject ModuleRepository,它继承自执行所有绑定(bind)的 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 对象返回 session 。

session 提供者

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

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

如果能帮助理解这一点,那就太好了。谢谢。

最佳答案

绑定(bind)使用:

Bind<ISession>().ToProvider<SessionProvider>().InRequestScope();

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

参见 this post Nate Kohari 对 Ninject 中不同作用域对象的描述。

关于c# - 需要帮助了解 Ninject 如何将 Nhibernate SessionFactory 实例放入 UnitOfWork 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5687355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com