2009-08-24 13 views
1

いくつかのリポジトリ間での(nHibernate)ITトランザクションを使用した作業の良いプラクティスは何ですか?いくつかの一般的なIRepositories間のトランザクションを処理する方法

ジェネリックインターフェイスで最初にBeginTransaction()を作成しましたが、リポジトリ間でこれがどのように機能するのか考えていますか?私は、リポジトリからのものを削除し、別のリポジトリからの他のものを削除したいが、トランザクション内で操作全体をラップすることを望むならば。

すべてのリポジトリは同じISession(DIフレームワークによって処理される)を共有していますが、リポジトリからITransactionを取得してコミットすると、他のリポジトリでも機能します。

答えて

0

私の代わりにクラス全体が、一般的な作りで、ちょうどこのように、各機能は、一般的な作ることができます結局のところ、ユニット作業パターンを実装しています。

+0

あなたは両方を行うことができますか、それはあなたが意味することですか? – Paco

2

リポジトリをトランザクション管理の対象にしないことで、 リポジトリに直接ISessionを挿入しないで、セッションを保持し、トランザクションを開始してコミットする作業ユニットを使用します。ので、多分それは価値がある、

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はに依存している:

INHibernateUnitOfWork 
{ 
    ISession CurrentSession { get; } 
    void Start(); // begins the transaction 
    void Commit(); 
    void RollBack(); 
} 
+0

合意しました(ただし、そのインターフェイスのポイントは表示されません)。通常これはIRepositoryをORMに無関係にしてセッションをコンストラクタに入れたいが、UoWで動かないようにしたいときに起こります。したがって抽象的なリポジトリで使用する抽象UoWを作成するか、時間を節約して、コードをISessionにコードするだけでよいでしょう。 – anonymous

+0

はい、私はちょうどこのパターンの上にこのパターンのかなり良いブログ記事を見つけました:http://elegantcode.com/2009/03/25/fubumvc-from-scratch-part-4-persistence/ –

+0

@eyston:リポジトリよりも他のデータアクセスのセカンダリでも使えるということです。より複雑なアプリケーションでは、リポジトリパターンだけでは、どのようなタイプのデータアクセスにも対応できない場合があります。このタイプの作業単位では、リポジトリORMを独立させることはありません。トランザクション独立性にのみなります。 @Carl:良いブログ投稿です。私が使用する作業単位の実装は、ほぼ同じように見えます。 – Paco

関連する問題