使用NHibernate的存储库模式?

cho*_*bo2 5 nhibernate repository-pattern

我想知道我的服务层应该知道我的存储库有多少?在过去的项目中,我总是返回列表,并为我需要的每件事提供方法.

因此,如果我需要返回ID为5的所有行,那么这将是一种方法.我有创建,更新,删除和其他NHibernate选项的通用存储库,但对于查询,我没有.

现在我开始使用更多的IQueryable,因为我开始遇到每种情况都有这么多方法的问题.

假设我需要返回所有具有特定Id并且需要3个表格的表格,这些表格是热切加载的,这将是一种新方法.如果我需要某个Id并且没有急切的加载,这将是一个单独的方法.

所以现在我在想如果我做了where子句部分的方法并返回IQueryable然后我可以添加结果(即如果我需要做急切加载).

同时虽然这现在使服务层更加了解存储库层,但我不再能像现在一样轻松地切换存储库,我在服务层中有特定的NHibernate.

我也不确定这会如何影响嘲笑.

所以现在我想知道如果需要存储库,我是否会沿着这条路走下去,因为它现在似乎已经混合在一起了.

编辑

如果我摆脱了我的存储库并且只是让我的服务层中的会话有一个工作单元的单位呢?

public class UnitOfWork : IUnitOfWork, IDisposable
    {
        private ITransaction transaction;
        private readonly ISession session;

        public UnitOfWork(ISession session)
        {
            this.session = session;
            session.FlushMode = FlushMode.Auto;
        }

        /// <summary>
        /// Starts a transaction with the database. Uses IsolationLevel.ReadCommitted
        /// </summary>
        public void BeginTransaction()
        {
            transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
        }

        /// <summary>
        /// starts a transaction with the database.
        /// </summary>
        /// <param name="level">IsolationLevel the transaction should run in.</param>
        public void BeginTransaction(IsolationLevel level)
        {
            transaction = session.BeginTransaction(level);
        }

        private bool IsTransactionActive()
        {
            return transaction.IsActive;
        }

        /// <summary>
        /// Commits the transaction and writes to the database.
        /// </summary>
        public void Commit()
        {
            // make sure a transaction was started before we try to commit.
            if (!IsTransactionActive())
            {
                throw new InvalidOperationException("Oops! We don't have an active transaction. Did a rollback occur before this commit was triggered: "
                                                            + transaction.WasRolledBack + " did a commit happen before this commit: " + transaction.WasCommitted);
            }

            transaction.Commit();
        }

        /// <summary>
        /// Rollback any writes to the databases.
        /// </summary>
        public void Rollback()
        {
            if (IsTransactionActive())
            {
                transaction.Rollback();
            }
        }

        public void Dispose() // don't know where to call this to see if it will solve my problem
        {
            if (session.IsOpen)
            {
                session.Close();
            }

        }
Run Code Online (Sandbox Code Playgroud)

Ton*_*nen 4

每个人都有关于如何使用存储库、抽象什么等的意见。Ayende Rahien 已经发表了一些关于这个问题的好文章:《在厄运深渊中进行架构设计:存储库抽象层存储库是新的单例的邪恶》 。这些给了您一些很好的理由,说明为什么您不应该尝试在 NHibernate 的 ISession 之上创建另一个抽象。