一個庫幫你快速實現EF Core數據倉儲模式

前言

EF Core是我們.NET日常開發中比較常用的ORM框架,今天大姚要分享的內容是如何使用EF Core Generic Repository通用倉儲庫來快速實現EF Core數據倉儲模式。

EF Core Generic Repository介紹

該庫是EF Core ORM的通用倉儲庫實現,旨在簡化開發人員爲每個.NET Core和.NET項目編寫倉儲層的工作。通過使用這個庫,開發人員可以更輕鬆地管理數據訪問層,提高開發效率。

值得推薦的.NET ORM框架

對於還不知道怎麼選擇.NET ORM框架的同學可以看下面這兩篇文章,希望對你會有所幫助😁。

數據倉儲(Repository)介紹

Repository(倉儲)是DDD(領域驅動設計)中的經典思想,可以歸納爲介於實際業務層(領域層)和數據訪問層之間的層,能讓領域層能在感覺不到數據訪問層的情況下,完成與數據庫的交互和以往的DAO(數據訪問)層相比,Repository層的設計理念更偏向於面向對象,而淡化直接對數據表進行的CRUD操作。

類庫特點

  • 該庫可以在任何. NET Core或.NET應用程序上運行,該應用程序具有.NET Core 3.1、.NET Standard 2.1和.NET 5.0+支持。
  • 提供了帶有數據庫事務支持的通用存儲庫。
  • 擁有所有必需的方法,以任何你想要的方式查詢數據,而無需從存儲庫獲取IQueryable。
  • 支持Specification<T>模式,使你能夠動態構建查詢,即延遲查詢構建。
  • 具有針對你的查詢的數據庫級投影支持。
  • 支持針對你的關係型數據庫運行原始SQL命令。
  • 支持選擇是否要跟蹤你的查詢實體/實體。
  • 支持在確實需要時重置你的EF Core DbContext狀態。
  • 具有完整的單元測試支持。
  • 支持分頁、原始SQL查詢支持複雜類型和原始類型。

項目源代碼

新建控制檯應用

新建名爲:GenericRepositoryExercise控制檯應用。

相關類庫安裝

搜索名爲:TanvirArjel.EFCore.GenericRepository的NuGet安裝。

因爲我們要訪問Microsoft SQL Server數據庫,因此我們需要安裝Microsoft.EntityFrameworkCore.SqlServer NuGet包。

新建UserInfo類

    [Table("UserInfo")]
    public class UserInfo
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public int Age { get; set; }

        [Required]
        public string Email { get; set; }
    }

新建數據庫上下文類

新建名爲:TestDbContext數據庫上下文類。

    public class TestDbContext : DbContext
    {
        public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
        {
        }

        public DbSet<UserInfo> UserInfo { get; set; }
    }

新建UserInfoService(包含常見CRUD)

      public class UserInfoService
    {
        private readonly IRepository<TestDbContext> _repository;

        public UserInfoService(IRepository<TestDbContext> repository)
        {
            _repository = repository;
        }

        public async Task UserInfoCRUD()
        {
            // 創建一個新用戶
            var newUser = new UserInfo { Name = "daydayup", Age = 28, Email = "[email protected]" };
            await _repository.AddAsync(newUser);
            await _repository.SaveChangesAsync();

            // 更新用戶信息
            newUser.Email = "[email protected]";
            _repository.Update(newUser);
            await _repository.SaveChangesAsync();

            // 刪除用戶
            _repository.Remove(newUser);
            await _repository.SaveChangesAsync();

            // 查詢所有用戶
            var users = await _repository.GetListAsync<UserInfo>();
            foreach (var user in users)
            {
                Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}");
            }

            //查詢總數
            var totalCount = await _repository.GetCountAsync<UserInfo>();

            // 根據條件查詢用戶
            var filteredUsers = await _repository.GetListAsync<UserInfo>(u => u.Age > 25);
            foreach (var user in filteredUsers)
            {
                Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}");
            }
        }
    }

在Program.cs中註冊相關服務

      internal class Program
    {
        static async Task Main(string[] args)
        {
            //設置依賴注入容器
            IServiceCollection services = new ServiceCollection();
            services.AddScoped<UserInfoService>();

            var connectionString = "Server=.;Database=MyTestDB;User Id=test;Password=123456;trustServerCertificate=true;";
            services.AddDbContext<TestDbContext>(option => option.UseSqlServer(connectionString));

            //註冊DbConext後立即調用它
            services.AddGenericRepository<TestDbContext>();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            //從容器中獲取UserInfoService實例並執行操作
            var userInfoService = serviceProvider.GetRequiredService<UserInfoService>();
            await userInfoService.UserInfoCRUD();
        }
    }

項目源碼地址

更多項目實用功能和特性歡迎前往項目開源地址查看👀,別忘了給項目一個Star支持💖。

優秀項目和框架精選

該項目已收錄到C#/.NET/.NET Core優秀項目和框架精選中,關注優秀項目和框架精選能讓你及時瞭解C#、.NET和.NET Core領域的最新動態和最佳實踐,提高開發工作效率和質量。坑已挖,歡迎大家踊躍提交PR推薦或自薦(讓優秀的項目和框架不被埋沒🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

DotNetGuide技術社區交流羣

  • DotNetGuide技術社區是一個面向.NET開發者的開源技術社區,旨在爲開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、項目框架推薦、求職和招聘資訊、以及解決問題的平臺。
  • 在DotNetGuide技術社區中,開發者們可以分享自己的技術文章、項目經驗、學習心得、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
  • 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺。無論您是初學者還是有豐富經驗的開發者,我們都希望能爲您提供更多的價值和成長機會。

歡迎加入DotNetGuide技術社區微信交流羣👪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章