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

标签 c# asp.net-mvc-2 dependency-injection ioc-container ninject

因此,借助教程中的一些帮助,我成功地使用 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/

相关文章:

c# - LINQ:如何根据上下文修改 AsParallel 的返回类型?

c# - Entity Framework 多对多关系表创建 "backwards"

c# - 在 try-catch : bad practice? 中包含服务执行

c# - 带有自定义异常的 ASP.NET MVC 2 模型错误

c# - 本地化 Windows Phone 8 'Application Title' 和 'Tile Title' 字符串

asp.net - 在 ASP.NET MVC2 创建方法中使用 FormCollection 的正确方法?

asp.net - MVC自定义模型绑定(bind)器问题

java - Spring - 如何避免协作服务之间的实现锁定

php - fatal error :registerContainerConfiguration 的声明必须与 Kernel::registerContainerConfiguration 的声明兼容

c# - 如何将依赖项注入(inject) .Net Core 项目中的自定义 WebHostService?