0

キャッスルウィンザーを学び始めたところです。NhibernateISessionの上に別の作業単位を追加する必要があるかどうかについて質問してください。

ウィンザーのチュートリアルでこれを見つけました。

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx

「重要なのは、今行ったことの目に見えない効果です。コンポーネントを登録することで、Windsorにコンポーネントの作成方法を指示しただけではありません。Windsorは、インスタンスを適切に破棄して、完全な管理を行います。素人の言葉で言えば、Windsorは、使用されなくなったときに両方のオブジェクトを破棄します。つまり、ISessionに加えた変更をデータベースにフラッシュし、ISessionFactoryをクリーンアップします。これですべてが取得されます。無料で。 "

データベースに変更をコミットする必要はないようです。Windsorがそれを処理します。Windsorは、ページが閉じられた後、または完全にロードされた後にそれを行うと想定しています。

今、私は他の人々がこのようなNhibrenateの上に別の作業単位を追加しているのを見ます。

どちらがベストプラクティスと見なされているのか知りたいですか?

            UnitOfWork unitOfWork = new UnitOfWork(session);
            Repository<Truck> repository = new Repository<Truck>(unitOfWork.Session);
            Truck truck = CreateTruck(string.Format("Truck {0}", i + 1), 1000);
            repository.Add(truck);
            unitOfWork.Commit();


            namespace RepositoryPattern.Data.Orm.nHibernate
            {
                public class UnitOfWork : IUnitOfWork
                {
                    public ISession Session { get; private set; }
                    private readonly ITransaction _transaction;

                    public UnitOfWork(ISession session)
                    {
                        Session = session
                        Session.FlushMode = FlushMode.Auto;
                        _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
                    }

                    public void Commit()
                    {
                        if (!_transaction.IsActive)
                        {
                            throw new InvalidOperationException("Oops! We don't have an active transaction");
                        }
                        _transaction.Commit();
                    }

                    public void Rollback()
                    {
                        if (_transaction.IsActive)
                        {
                            _transaction.Rollback();
                        }
                    }

                    public void Dispose()
                    {
                        if (Session.IsOpen)
                        {
                            Session.Close();
                        }
                    }
                }
            }
4

1 に答える 1

0

確かではありませんが、私はこのルートには行きません。非常に複雑に見えます。using(session.open..) { ... } を使用したくない理由はありますか?

于 2011-12-25T20:27:06.933 に答える