我想在我的應用程序中實現最小的通用存儲庫模式。我有查詢和保存數據一個非常小的接口:使用實體框架的最小存儲庫實現
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; }
}
我試圖找到一個工作實現使用實體框架這樣一個簡單的存儲庫,但是很難找到(人們使用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的新手,並且擔心可能出現的性能問題或使用此類存儲庫時可能出錯的事情。
注:我試圖做這一切的原因有二:
- 出於測試目的,這樣我可以在我的單元測試創建存儲庫的模擬項目
- 這可能是我將來必須切換到另一個ORM,並且我希望儘可能簡化這個過渡。
如果您是在輕觸後出現性能問題,EF是否適合使用,可能值得考慮。從個人經驗來看,我還沒有發現EF在我使用過的任何項目中都表現得非常好,並且它有點笨拙,使它的映射符合數據庫或代碼(取決於您選擇的路徑,代碼或DB首先)。 我認識的任何人在高吞吐量環境中工作時,只要有人提到EF,就會身體上發生變化。 –
問題的確是:因爲EF *已經*實現了庫('DbSet')和工作單元('DbContext')模式 - 爲什麼重新發明了另一個層面的輪子? –
@marc_s,我有2個理由:)請參閱我的編輯 –