5

GenericRepository の実現を見てきました:

namespace ContosoUniversity.DAL
{
    public class GenericRepository<TEntity> where TEntity : class
    {
        internal SchoolContext context;
        internal DbSet<TEntity> dbSet;

        public GenericRepository(SchoolContext context)
        {
            this.context = context;
            this.dbSet = context.Set<TEntity>();
        }

        public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            string includeProperties = "")
        {
            IQueryable<TEntity> query = dbSet;

            if (filter != null)
            {
                query = query.Where(filter);
            }

            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }

            if (orderBy != null)
            {
                return orderBy(query).ToList();
            }
            else
            {
                return query.ToList();
            }
        }

        public virtual TEntity GetByID(object id)
        {
            return dbSet.Find(id);
        }

        public virtual void Insert(TEntity entity)
        {
            dbSet.Add(entity);
        }

        public virtual void Delete(object id)
        {
            TEntity entityToDelete = dbSet.Find(id);
            Delete(entityToDelete);
        }

        public virtual void Delete(TEntity entityToDelete)
        {
            if (context.Entry(entityToDelete).State == EntityState.Detached)
            {
                dbSet.Attach(entityToDelete);
            }
            dbSet.Remove(entityToDelete);
        }

        public virtual void Update(TEntity entityToUpdate)
        {
            dbSet.Attach(entityToUpdate);
            context.Entry(entityToUpdate).State = EntityState.Modified;
        }
    }
}

ここ: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp- net-mvc-application で、とてもいいと思いますが、質問させてください。個別の実現 (個別のクラスの各エンティティ リポジトリ) を使用したこのアプローチの長所と短所は何ですか?

4

3 に答える 3

1

Repositoryエンティティごとに具体的なクラスが必要だと判断した場合でも、コードを複製せず、共通の機能を1か所でテストできるように、少なくとも汎用リポジトリをベースとして使用することは絶対に理にかなっています。

現実的には、この慣行には短所はありません。メソッドの1つが特定のエンティティに対してどのように機能するかを判断する必要がある場合は、それをオーバーライドして修正し、単体テストでカバーされていることを確認します。

于 2012-06-19T11:47:47.087 に答える
1

これは何よりも個人的な好みです。個人的には、リポジトリという用語はあまり一般的ではなく、リポジトリの意味/目的が失われているため、好きではありません。すべてのエンティティが独自のリポジトリを必要とするかのように、リポジトリは一般的で反復的であることがよくあります。そして、レポはクエリ用の1回限りのメソッドを取得しすぎます。すぐに、データ アクセス用の神のクラスが作成されます。これは私の経験です。

ジェネリック リポジトリを使用すると、継承を使用して、オン/オフ クエリ用の特定のエンティティにサブクラス化できます。私は継承よりも構成を好むので、リポジトリの用語/使用を避けるもう 1 つの理由です。

代わりに、データ アクセスをクエリ (読み取り) & コマンド (書き込み) オブジェクトと考えるのが好きです。ここで、各オブジェクトには、データの特定の投影 (クエリ) を取得するか、永続化されたデータを変更する (コマンド) ためのメソッドが 1 つあります。

最終的には、あなたとあなたのチームがアーキテクチャを理解し、コードが保守可能である限り、確実なソリューションを手に入れることができます。それは本当に良い悪いではありません。

于 2012-06-19T11:52:22.880 に答える
1

一般的なデコレータの使用については、いくつかの意見があります。基本的に2つのキャンプがあります。最初の陣営では、汎用リポジトリが漏れやすい抽象化であることがわかります。つまり、多くの場合、それを使用してデータソースを実際に抽象化していません。したがって、まったく使用しないでください。たとえば、この回答を読んでください。

私は第二陣営です。私はそれが漏れやすい抽象化であることを知っていますが、一般的なリポジトリ (特にIQuerableサポート付き) は、あまりにも表現力豊かでテスト可能なコードにつながるだけであり、無視されます。汎用リポジトリに関する記事を書きました。これは、リンク ポイントの追加にアプローチする別のアプローチです。保守性とテスト容易性に重点を置いて、一般的なリポジトリに異なるアプローチを提供します。役に立つかもしれません。

于 2012-06-19T11:57:55.103 に答える