【问题标题】:Need help understanding how Ninject is getting a Nhibernate SessionFactory instance into a UnitOfWork?需要帮助了解 Ninject 如何将 Nhibernate SessionFactory 实例放入 UnitOfWork?
【发布时间】: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


    【解决方案1】:

    绑定使用:

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

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

    有关 Ninject 中不同作用域对象的描述,请参阅 Nate Kohari 的 this post

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 2020-10-20
      • 2021-11-16
      • 2017-06-19
      • 2016-05-03
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多