私はアプリケーションに最小限の汎用リポジトリパターンを実装しようとしています。Entity Frameworkを使用した最小限のリポジトリ実装
public interface IRepository
{
IQueryable<TEntity> Query<TEntity>()
where TEntity: BaseEntity;
void Save<TEntity>(TEntity entity)
where TEntity : BaseEntity;
}
BaseEntity
が、私は私のリポジトリに保存するすべてのオブジェクトの基本クラスです:私は、データを照会し、保存するための本当に小さなインタフェースを持って、私は作業の実装を見つけるためにしようとしていた
public abstract class BaseEntity
{
public Guid Id { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
}
そのような単純なリポジトリのEntity Frameworkを使用していましたが、驚くほど見つけにくかった(人々はUnitOfWork
などを使用しています。
public class EfRepository : DbContext, IRepository
{
public IQueryable<TEntity> Query<TEntity>() where TEntity : BaseEntity
{
return this.Set<TEntity>();
}
public void Save<TEntity>(TEntity entity) where TEntity : BaseEntity
{
if (entity.Id == default(Guid))
{
entity.Id = Guid.NewGuid();
this.Set<TEntity>().Add(entity);
}
else
{
this.Entry(entity).State = EntityState.Modified;
}
this.SaveChanges();
}
public DbSet<User> Users { get; set; } // User is a subclass of BaseEntity
//Other DbSet's...
}
は今、私の質問です。私はEntity Frameworkの初心者で、パフォーマンスの問題や、そのようなリポジトリの使用中に間違っている可能性があることを心配しています。
注:私は2つの理由のために、このすべてをやろうとしている:私は私のユニットテストプロジェクトにリポジトリのモックを作成できるように、テストのため
- それは私が可能です将来別のORMに切り替える必要があります。この移行をできるだけ簡単にしたいと考えています。
軽いタッチでパフォーマンス上の懸念がある場合に、EFが使用するORMが適切かどうか検討する価値はあります。個人的な経験から私はEFが私が使っているプロジェクトではそれほどパフォーマンスが良いとは思っていませんでしたが、DBやコードに合わせてマッピングを維持するのはちょっとしたことです(選択するパス、コード、最初にDB)。 誰かが、ハイスループット環境で誰が働いているかは、誰でもEFが言及されるたびに肉体的に強くなることを知っています。 –
質問は本当にです:EF *は既にリポジトリ( 'DbSet')と作業単位( 'DbContext')パターンを実装しています。 –
@marc_s、私は2つの理由があります:)私の編集を参照してください –