FreeSql.Repository (一)什麼是倉儲

FreeSql發表於2020-12-11

歡迎來到《FreeSql.Repository 倉儲模式》系列文件,完整文件請前往 wiki 中心:https://github.com/dotnetcore/FreeSql/wiki

FreeSql是功能強大的 .NET ORM,支援 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支援 NetStandard 所有執行平臺。支援 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/達夢/神通/人大金倉/翰高/MsAccess 資料庫。QQ群:4336577(已滿)、8578575(線上)、52508226(線上)

FreeSql 支援五種使用方式,根據實際情況選擇團隊合適的一種:

  • 要麼 FreeSql,原始用法;
  • 要麼 FreeSql.Repository,倉儲+工作單元習慣;
  • 要麼 FreeSql.DbContext,有點像 EFCore 的使用習慣;
  • 要麼 FreeSql.BaseEntity,求簡單使用這個;
  • 要麼 IDbConnection CRUD,有點像 Dapper;

本系列文件,專注介紹 【倉儲+工作單元】 的使用方式。

理解倉儲

倉儲是一種設計模式概念,不同於以往的 DAL,在 .NET 世界人們往往把倉儲向 DDD 靠近,又把 EFCore 向 DDD 靠近。

我理解的倉儲對標 JPA,更像一種 ORM 規範,使得應用程式不再深度依賴某一個特定的 ORM。

使用倉儲的目標:能低成本的切換 ORM

倉儲功能

  • 插入、批量插入;
  • 更新、批量更新;
  • 刪除、批量刪除;
  • 查詢;
  • 實現工作單元事務;

以上幾點是倉儲的幾個基本功能要求,定義不宜複雜,越複雜最終切換 ORM 越困難。

簡單的倉儲介面定義如下:

  • IBaseRepository
  • IBaseRepository<TEntity>
  • IBaseRepository<TEntity, TKey>
public interface IBaseRepository : IDisposable
{
    Type EntityType { get; }
    IUnitOfWork UnitOfWork { get; set; }
}

public interface IBaseRepository<TEntity> : IBaseRepository
    where TEntity : class
{
    IDataFilter<TEntity> DataFilter { get; }
    ISelect<TEntity> Select { get; }

    ISelect<TEntity> Where(Expression<Func<TEntity, bool>> exp);
    ISelect<TEntity> WhereIf(bool condition, Expression<Func<TEntity, bool>> exp);

    TEntity Insert(TEntity entity);
    List<TEntity> Insert(IEnumerable<TEntity> entitys);

    int Update(TEntity entity);
    int Update(IEnumerable<TEntity> entitys);

    TEntity InsertOrUpdate(TEntity entity);

    int Delete(TEntity entity);
    int Delete(IEnumerable<TEntity> entitys);
    int Delete(Expression<Func<TEntity, bool>> predicate);
}

public interface IBaseRepository<TEntity, TKey> : IBaseRepository<TEntity>
    where TEntity : class
{
    TEntity Get(TKey id);
    TEntity Find(TKey id);
    int Delete(TKey id);
}

FreeSql.Repository

倉儲定義越簡單,切換 ORM 越容易沒錯,但是開發起來也越麻煩,魚和熊掌不可兼得,需要找到一個平衡點。

FreeSql.Repository 在基本功能上有額外的定義:

  • 狀態管理,只更新變化的欄位;
  • 支援使用導航屬性、多表查詢、級聯載入、級聯儲存;
  • 動態實體型別的 CRUD;
  • 過濾器;

後續文章將對 FreeSql.Repository 功能逐一展開解釋。

系列文章導航

相關文章