برنامه نویسی

اجرای الگوی مخزن با چارچوب Entity و Dapper در یک برنامه C#

به عنوان یک توسعه دهنده C# ، ممکن است با سناریوهایی روبرو شوید که یک ابزار دسترسی به داده کافی نیست. Entity Framework (EF) عملیات پایگاه داده را با انتزاع سطح بالا آن ساده می کند ، در حالی که Dapper سرعت خام را برای نمایش داده های پیچیده ارائه می دهد. ترکیب هر دو در یک برنامه واحد به شما امکان می دهد تا بهره وری و عملکرد را متعادل کنید. در اینجا نحوه اجرای الگوی مخزن با هر دو ابزار به طور مؤثر آورده شده است.


چرا از EF و Dapper استفاده می کنیم؟

  1. چارچوب موجودیت (EF): ایده آل برای عملیات CRUD ، روابط و توسعه سریع. پشتیبانی LINQ آن کد دیگ بخار را کاهش می دهد.
  2. دلپذیر: یک میکرو طوفانی سبک وزن مناسب برای عملیات سنگین خواندن یا نمایش داده های پیچیده SQL که در آن عملکرد اهمیت دارد.

با استفاده از EF برای عملیات نوشتن و Dapper برای خواندن ، شما هم سرعت توسعه و هم کارایی اجرای را بهینه می کنید.


مرحله 1: رابط های مخزن را تعریف کنید

با ایجاد رابط های عمومی برای دسترسی به داده های انتزاعی شروع کنید. این باعث می شود قوام در برنامه شما باشد.

public interface IRepository<T> where T : class  
{  
    Task AddAsync(T entity);  
    Task UpdateAsync(T entity);  
    Task DeleteAsync(T entity);  
    Task<T?> GetByIdAsync(int id);  
}  

public interface IReadRepository<T> where T : class  
{  
    Task<IEnumerable<T>> QueryAsync(string sql, object? parameters = null);  
}  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • IRepository: از EF برای نوشتن و خواندن های اساسی استفاده می کند.
  • IReadRepository: از Dapper برای عملکرد پرس و جو سفارشی استفاده می کند.

مرحله 2: EF را برای عملیات نوشتن پیاده سازی کنید

یک مخزن EF عمومی برای انجام عملیات مشترک ایجاد کنید:

public class EfRepository<T> : IRepository<T> where T : class  
{  
    private readonly AppDbContext _context;  

    public EfRepository(AppDbContext context)  
    {  
        _context = context;  
    }  

    public async Task AddAsync(T entity) =>  
        await _context.Set<T>().AddAsync(entity);  

    public async Task UpdateAsync(T entity) =>  
        _context.Set<T>().Update(entity);  

    // Other methods (GetById, Delete) use _context  
}  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مرحله 3: Dapper را برای عملیات خواندن اجرا کنید

برای نمایش داده های بهینه ، یک مخزن dapper بسازید. تزریق کردن IDbConnection برای استفاده مجدد از اتصال پایگاه داده خود.

public class DapperRepository<T> : IReadRepository<T> where T : class  
{  
    private readonly IDbConnection _connection;  

    public DapperRepository(IDbConnection connection)  
    {  
        _connection = connection;  
    }  

    public async Task<IEnumerable<T>> QueryAsync(string sql, object? parameters = null)  
    {  
        return await _connection.QueryAsync<T>(sql, parameters);  
    }  
}  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مرحله 4: وابستگی ها را ثبت کنید

در شما Program.cs، هر دو مخزن را با تزریق وابستگی ثبت کنید:

// For Entity Framework  
builder.Services.AddDbContext<AppDbContext>(options =>  
    options.UseSqlServer(configuration.GetConnectionString("Default")));  

builder.Services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>));  

// For Dapper  
builder.Services.AddScoped(typeof(IReadRepository<>), typeof(DapperRepository<>));  
builder.Services.AddScoped<IDbConnection>(_ =>  
    new SqlConnection(configuration.GetConnectionString("Default")));  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مرحله 5: از هر دو مخزن در خدمات استفاده کنید

مخازن را به لایه خدمات خود تزریق کنید. از EF برای نوشتن و dapper برای خواندن استفاده کنید:

public class ProductService  
{  
    private readonly IRepository<Product> _efRepository;  
    private readonly IReadRepository<Product> _dapperRepository;  

    public ProductService(  
        IRepository<Product> efRepository,  
        IReadRepository<Product> dapperRepository)  
    {  
        _efRepository = efRepository;  
        _dapperRepository = dapperRepository;  
    }  

    public async Task AddProduct(Product product) =>  
        await _efRepository.AddAsync(product);  

    public async Task<List<Product>> GetExpensiveProducts()  
    {  
        string sql = "SELECT * FROM Products WHERE Price > 100";  
        return (await _dapperRepository.QueryAsync(sql)).ToList();  
    }  
}  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


چه زمانی از هر ابزار استفاده کنید

  • EF: عالی برای معاملات ، نمودارهای شیء پیچیده یا هنگامی که به ردیابی تغییر نیاز دارید.
  • دلپذیر: برای گزارش ها ، بازیابی داده های فله یا روشهای ذخیره شده استفاده کنید.

پایان

با ترکیب EF و Dapper با الگوی مخزن ، بهترین ها را از هر دو جهان بدست می آورید: سهولت استفاده EF برای نوشتن و سرعت Dapper برای خواندن. این رویکرد کد شما را تمیز ، مقیاس پذیر و اجرا نگه می دارد. همیشه نیازهای برنامه خود را برای تصمیم گیری در مورد کدام ابزار متناسب با هر سناریو تجزیه و تحلیل کنید.

این استراتژی به ویژه در سیستم های بزرگی که انعطاف پذیری و کارآیی بسیار مهم است مفید است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا