2012-02-23 12 views
1

1)並行性制御のために、より適切な/一般的に使用されるアプローチは何ですか?悲観的または楽観的なロック?長いセッションのバージョン同時実行制御。 NHibernate。 ASP.NET MVC

2)アイテムにロックがあるか、ロールバックが発生したかどうかをユーザーに通知するにはどうすればよいですか?

3)私は私が私のエンティティマッピングファイルに)比較に関与したくないプロパティを除外するような(optimistic-locking="false"をすべての必要なマークアップを追加しましたと仮定してエンティティクラス処理するためにVersionプロパティを定義し並行性制御。それで充分で、すべてのものはNHibernate内で処理されますか?または、追加改変が存在するはずですか?たとえば、Repository

public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot 
{ 
    private ISession session; 

    public Repository(ISession session) 
    { 
     this.session = session; 
    } 

    public T Get(Guid id) 
    {    
     return this.session.Get<T>(id);    
    } 
    public IQueryable<T> Get(Expression<Func<T, Boolean>> predicate) 
    { 
     return this.session.Query<T>().Where(predicate);    
    } 
    public IQueryable<T> Get() 
    { 
     return this.session.Query<T>();    
    } 
    public T Load(Guid id) 
    { 
     return this.session.Load<T>(id); 
    } 
    public void Add(T entity) 
    {    
     using(var transaction = this.session.BeginTransaction()) 
     { 
      this.session.Save(entity); 
      transaction.Commit(); 
     } 
    } 
    public void Remove(T entity) 
    {    
     using(var transaction = this.session.BeginTransaction()) 
     { 
      this.session.Delete(entity); 
      transaction.Commit(); 
     } 
    } 
    public void Remove(Guid id) 
    {    
     using(var transaction = this.session.BeginTransaction()) 
     { 
      this.session.Delete(this.session.Load<T>(id)); 
      transaction.Commit(); 
     } 
    } 
    public void Update(T entity) 
    {    
     using(var transaction = this.session.BeginTransaction()) 
     { 
      this.session.Update(entity); 
      transaction.Commit(); 
     } 
    } 
    public void Update(Guid id) 
    {    
     using(var transaction = this.session.BeginTransaction()) 
     { 
      this.session.Update(this.session.Load<T>(id)); 
      transaction.Commit(); 
     } 
    } 
} 

// DI 
public class DataAccessModule : Ninject.Modules.NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<ISessionFactory>() 
      .ToMethod(c => new Configuration().Configure().BuildSessionFactory()) 
      .InSingletonScope(); 

     this.Bind<ISession>() 
      .ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession()) 
      .InRequestScope(); 

     this.Bind(typeof(IRepository<>)).To(typeof(Repository<>)); 
    } 
} 

私は複数のトランザクションで長いセッションを使用しています。

ありがとうございます!

答えて

1

リポジトリは決してトランザクションスコープを処理するべきではありません。その全く異なる要件とリポジトリは、トランザクションの境界を知ることができません。

トランザクションは、インフラストラクチャコードによって外部のどこかで処理する必要があります。 ASP.NET MVCを使用している場合、アクションフィルタが適切です(実装はSharp Architectureプロジェクトを参照してください)。

ASP.NETのモジュールまたはグローバルasax処理を適用できる場合。

しかし、ちょうどリポジトリでそれを処理しないでください。非常に漏れやすい抽象で、呼び出し側に境界を公開する必要があります。

+0

私はこれがリポジトリにトランザクションを公開するのはなぜ悪い習慣であるのか検索しました。だから今私は2つの質問があります。私は私の 'session-per-request'スキームを維持します。論理が同じままであれば、私はどのような問題を考慮する必要がありますか?そして2番目。アクションフィルタベースのトランザクション処理またはそれ以外の処理のいずれかを実装するためのアプローチはたくさんあります。しかし、彼らの大部分は論争があり、全く明確ではありません。あなたは一貫した説明をしてくれますか?どうもありがとう! – lexeme

+0

こちらをご覧くださいhttps://github.com/sharparchitecture/Sharp-Architecture/tree/master/Solutions/SharpArch.NHibernateおそらく最適な方向 – Sly

+0

私はそれについて調べました。ありがとう。しかし、私は解決策が提供されている問題ではまだ興味があります。どんな問題に直面するでしょうか。データベースへの書き込みが間違っていますか?私たちを手伝ってくれますか?おそらくデータアクセス戦略の実装に間違いがあるかもしれないので、私はプロジェクトをほとんど作ってから頼んでいます。 – lexeme

関連する問題