IUnityOfWork~方法の完全性と統一提出が矛盾しないと言います。

6265 ワード

目次に戻ります
第一に、アイユニティOfWorkを知っています。なぜアイユニティOfWorkインターフェースが現れたのですか?
第二に、Linq to SqlとEnttityFraamewarksの中のSubmtChanges()に何かが起こったのですか?
第三講方法の完全性と統一提出は衝突しません。
第四講DbContectオブジェクトの作成はBLL層に公開すべきです。
第五に、私のIUnityOfWork+Repositoryアーキテクチャについて話します。
 
    一つの方法の中で、普通は一つのことをします。このような方法は機能的にはっきりしています。職責の面でも単一です。(ここの単一はいい意味です。ほほほ)、それがしたこのことは最初から最後までやり終えます。半分の機能はできません。これは機能的に不完全です。これは私達がオススメしたのではありません。
プロジェクトのコード:
完全な提出方法:
        protected virtual void SaveChanges()
        {
            if (!iUnitWork.IsNotSubmit)
                iUnitWork.Save();
        }
完全な挿入方法:
       public virtual void Add(TEntity item)
        {
            _db.Entry<TEntity>(item);
            _db.Set<TEntity>().Add(item);
            this.SaveChanges();
        }
上のコードはEF実装の挿入であり、完全であり、エンティティ集合に追加され、SaveChanges()を使用してデータベースに提出され、完全なデータ挿入プロセスが完了しました。
業務操作は一枚の表を挿入するだけでなく、もう一つの表を更新します。どうやって実現しますか?
       public virtual void Modify(TEntity item)
        {
            _db.Set<TEntity>().Attach(item);
            _db.Entry(item).State = EntityState.Modified;
            this.SaveChanges();
        }
上の完全な更新動作は上のコードです。今は仮説があります。
UserRepository類には方法があります。Add、Product Repository類には方法があります。この場合、この二つの方法は組織されます。コードはこうなります。
…コード
userRepository.Add(user);
userRepository.Modify;
…コード
      実際には、上のコードが実行される過程は、まずユーザーテーブルを挿入してSQLデータベースに提出し、製品表を更新してSQLデータベースに提出する場合、SQL端末は2回提出することによって、2つの接続池が発生し、もし両方の方法がTransaction Scompleサービスブロックを使用したら、SQLサーバとWWサーバは異なるコンピュータ上にあります。より多くの分散的な事務をトリガすることができます(これは避けることができます)が、我々は、windowsのMSDTCサービスが最も信頼できないことを知っています。
このような状況をどう解決すればいいですか?方法は完全ではないですか?
どのような問題にも解決の方法があります。システム設計上は方法の完全性は問題ありません。しかし、時々、一つの作業ユニットの中に複数の方法がある場合、このような完全性をアップグレードし、複数の方法を一つの全体にアップグレードする必要があります。つまり、複数の方法の完全性の問題を解決する鍵は、あなたのデータコンテキストが一つであるかどうかです。あなたのsubmit Changes方法は一つですか?
IUnityWorkの斬新なインターフェース仕様
    /// <summary>
    ///     
    ///         ,         ,        
    /// </summary>
    public interface IUnitOfWork
    {
        /// <summary>
        ////// </summary>
        void Save();
        /// <summary>
        ///          ,       repository   SaveChanges      
        ///    false,          
        /// </summary>
        /// <returns></returns>
        bool IsNotSubmit { get; set; }
    }

    /// <summary>
    ///     
    ///         
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IUnitWork<T> : IUnitOfWork where T : class { }
上のインターフェースを見て、私はもちろん、皆さんもその意味を知っています。Save()はデータの文脈のために提出します。IsNot Submitはデータベースに提出するかどうかを表しています。私達はすべてbookの種類の対象のデフォルトを知っています。
値はfalseではないので、デフォルトではAdd、Modifyといった方法の提出動作はtrueであり、データベースに提出されます。
この時上のaddとmodifyを最適化する方法は以下の通りです。
Domain.Core.IUnitOfWork _iUnitWork = new backgroundEntities();
 _iUnitWork.IsNotSubmit=true;
userRepository(user);
productRepository(product); 
_iUnitWork.Save();
上記のコードで発生した効果は、二つのSQL文をSQL端に送り、一つのSQL接続池を使って、MSDTCサービスを発生しないということです。
目次に戻ります