2011-10-23 9 views
3

データアクセスのためにリポジトリを使用していましたが、作業ユニットのパターンに似たものは何も実装していませんでした。私はRavenDBとASP.NET MVCを使って自己教育のための新しいプロジェクトを始めました(理論的には些細でなければならない細部)。ビジネストランザクションをラップするための良い方法を確立しようとしています(ではなくウェブリクエスト)仕事の単位は、しかし、いくつかの難しさをそうしています。作業ユニットからリポジトリにデータコンテキストを渡す

次のコードスニペットは、私が見てようをいただきたいものです。

public class UserService : IUserService 
    { 
     private readonly IRepository<User> _userRepository; 
     private readonly IRepository<Role> _roleRepository; 

     public UserService(
       IRepository<User> userRepository, 
       IRepository<Role> roleRepository) 
     { 
      _userRepository = userRepository; 
      _roleRepository = roleRepository; 
     } 

     public void Register(User user) 
     { 
      using (var session = UnitOfWork.Begin()) 
      { 
       _userRepository.Create(user); 
       _roleRepository.AddToRole(user, Role.Public); 
       session.Commit(); 
      } 
     } 
    } 

は、ワークインターフェースの単位での私の最初の刺し傷は、次のようになります。

私は「
public interface IUnitOfWork : IDisposable 
    { 
     void Commit(); 
    } 

    public class UnitOfWork : IUnitOfWork 
    { 
     private readonly IDocumentSession _session; 

     public UnitOfWork(IDocumentStore documentStore) 
     { 
      _session = documentStore.OpenSession("http://from:config"); 
     } 

     public void Commit() 
     { 
      _session.SaveChanges(); 
     } 

     public static IUnitOfWork Begin() 
     { 
      return IoC.GetInstance<IUnitOfWork>(); 
     } 

     public void Dispose() 
     { 
      _session.Dispose(); 
     } 
    } 

m stuckは、リポジトリのデータベースセッションへのアクセスです。私が言及したように、私は商取引を自分の単位で包んでいます。私はまたセッション/コンテキストを各メソッドに渡すことに熱心ではなく、私が見た他のほとんどのソリューションは静的メソッドやストレージをWebセッションのようなもので使用しています。これらのすべてが私を少し不快にさせます。このユニット全体のコンセプトに欠けているものがありますか?

+1

あなたは、2つの追加オプションがあります。 2. Commitメソッドで行われたすべての変更(追加、削除、変更)を追跡し、これらすべての変更を調整するカスタムUnitOfWork実装を設計します。 –

答えて

1

私はTransactionScopeの概念を気にしていません。さらなる研究&の議論は、私がしようとしていることは単に実現可能ではないと信じさせました。

最後に、UnitOfWorkのコンテキスト内のリポジトリは、(明示的に)UnitOfWorkを知る必要があります。私はまだ行くどの方法に落ち着いていないが、私は次のような何かをするつもりです:

using (var session = UnitOfWork.Begin()) 
      { 
       _userRepository.Use(session).Create(user); 
       _roleRepository.Use(session).AddToRole(user, Role.Public); 
       session.Commit(); 
      } 

または

using (var session = UnitOfWork.Begin()) 
      { 
       session.Get<IUserRepository>().Create(user); 
       session.Get<IRoleRepository>().AddToRole(user, Role.Public); 
       session.Commit(); 
      } 

私はアプローチのいずれかに夢中じゃありません;私はよりよい提案を受けるまでこれを答えとしてマークします。それは技術にとらわれないで、あなたはどのセッションまたはコンテキスト情報を渡す必要がいけないよう 1.ネット分散トランザクション(TransactionScopeの)ビジネストランザクション管理など:

0

Julia Lermanには、Entity Frameworkを使用した作業単位のいくつかの素晴らしい例があります。

エンティティフレームワークでは、コンテキストでサポートされているため、作業単位を実装するのは非常に簡単です。 私が見る主な問題は、どのように注文を管理するかということです。 例:表Aおよび表B

表Bには表Aの外部キーがあります。 作業単位にはエラーが発生する可能性があります。 私はNhibernateやEFのようなOR/Mと一緒に行きます。 これはもっと簡単にするはずです。

+0

私は特定のOR/M実装に縛られたくありません。 – egoodberry

関連する問題