代码之家  ›  专栏  ›  技术社区  ›  Carl Hörberg

如何处理几个通用iRepository之间的事务

  •  1
  • Carl Hörberg  · 技术社区  · 15 年前

    在多个存储库之间使用(nhibernate)itransactions的良好实践是什么?

    首先在通用接口上创建了一个beginTransaction(),然后我开始考虑如何在存储库之间工作?我的意思是,如果从存储库中删除内容,然后从另一个存储库中删除其他内容,但希望将整个操作包装在一个事务中。

    尽管所有的存储库共享相同的ISession(由DI框架处理),所以我想可以从任何存储库中获取ITransaction,然后提交它,它也将适用于所有其他存储库。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Paco    15 年前

    不让存储库负责事务管理。 不要直接在存储库中注入ISession,而是使用保存会话并启动和提交事务的工作单元。

    INHibernateUnitOfWork
    {
       ISession CurrentSession { get; }
       void Start(); // begins the transaction
       void Commit();
       void RollBack();
    }
    
        2
  •  0
  •   Carl Hörberg    15 年前

    我可以不将整个类设为泛型,而是将每个函数设为泛型,如下所示:

    public interface IRepository
    {
        T Get<T>(int id);
        T SingleOrDefault<T>(Func<T, bool> query);
        IQueryable<T> Where<T>(Expression<Func<T, bool>> query);
        IQueryable<T> All<T>();
        void Save<T>(T entity);
        void Delete<T>(T entity);
        ITransaction BeginTransaction();
    }
    

    但是无论如何,接口或多或少依赖于NHibernate,所以也许它终究值得实现工作单元模式。