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

به عنوان یک توسعه دهنده C# ، ممکن است با سناریوهایی روبرو شوید که یک ابزار دسترسی به داده کافی نیست. Entity Framework (EF) عملیات پایگاه داده را با انتزاع سطح بالا آن ساده می کند ، در حالی که Dapper سرعت خام را برای نمایش داده های پیچیده ارائه می دهد. ترکیب هر دو در یک برنامه واحد به شما امکان می دهد تا بهره وری و عملکرد را متعادل کنید. در اینجا نحوه اجرای الگوی مخزن با هر دو ابزار به طور مؤثر آورده شده است.
چرا از EF و Dapper استفاده می کنیم؟
- چارچوب موجودیت (EF): ایده آل برای عملیات CRUD ، روابط و توسعه سریع. پشتیبانی LINQ آن کد دیگ بخار را کاهش می دهد.
- دلپذیر: یک میکرو طوفانی سبک وزن مناسب برای عملیات سنگین خواندن یا نمایش داده های پیچیده 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 برای خواندن. این رویکرد کد شما را تمیز ، مقیاس پذیر و اجرا نگه می دارد. همیشه نیازهای برنامه خود را برای تصمیم گیری در مورد کدام ابزار متناسب با هر سناریو تجزیه و تحلیل کنید.
این استراتژی به ویژه در سیستم های بزرگی که انعطاف پذیری و کارآیی بسیار مهم است مفید است.