// The Repository Pattern is a design pattern commonly used in C# applications to separate the data access logic from the business logic.
// This pattern aims to create a layer that isolates the database access, enabling a more modular, maintainable, and testable codebase.
// Here's a basic example to demonstrate how to implement the Repository Pattern in C#.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
using System.Collections.Generic;
public interface IProductRepository
{
IEnumerable GetAll();
Product GetById(int id);
void Add(Product product);
void Update(Product product);
void Delete(int id);
}
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
public class ProductRepository : IProductRepository
{
private readonly AppDbContext _context;
public ProductRepository(AppDbContext context)
{
_context = context;
}
public IEnumerable GetAll()
{
return _context.Products.ToList();
}
public Product GetById(int id)
{
return _context.Products.Find(id);
}
public void Add(Product product)
{
_context.Products.Add(product);
_context.SaveChanges();
}
public void Update(Product product)
{
_context.Products.Update(product);
_context.SaveChanges();
}
public void Delete(int id)
{
var product = _context.Products.Find(id);
if (product != null)
{
_context.Products.Remove(product);
_context.SaveChanges();
}
}
}
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet Products { get; set; }
public AppDbContext(DbContextOptions options) : base(options)
{
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped();
services.AddControllersWithViews();
}
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
public class ProductsController : Controller
{
private readonly IProductRepository _productRepository;
public ProductsController(IProductRepository productRepository)
{
_productRepository = productRepository;
}
public IActionResult Index()
{
IEnumerable products = _productRepository.GetAll();
return View(products);
}
public IActionResult Details(int id)
{
Product product = _productRepository.GetById(id);
if (product == null)
{
return NotFound();
}
return View(product);
}
// Add other actions for Create, Update, and Delete operations
}
///// setup unit tests /////
dotnet add package Microsoft.EntityFrameworkCore.InMemory
dotnet add package Moq
dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package Microsoft.NET.Test.Sdk
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Moq;
using Xunit;
public class ProductRepositoryTests
{
private DbContextOptions _dbContextOptions;
public ProductRepositoryTests()
{
_dbContextOptions = new DbContextOptionsBuilder()
.UseInMemoryDatabase(databaseName: "TestDatabase")
.Options;
using (var context = new AppDbContext(_dbContextOptions))
{
context.Products.Add(new Product { Id = 1, Name = "Product1", Price = 10 });
context.Products.Add(new Product { Id = 2, Name = "Product2", Price = 20 });
context.SaveChanges();
}
}
[Fact]
public void GetAll_ReturnsAllProducts()
{
using (var context = new AppDbContext(_dbContextOptions))
{
var repository = new ProductRepository(context);
var products = repository.GetAll().ToList();
Assert.Equal(2, products.Count);
Assert.Equal("Product1", products[0].Name);
Assert.Equal("Product2", products[1].Name);
}
}
[Fact]
public void GetById_ReturnsCorrectProduct()
{
using (var context = new AppDbContext(_dbContextOptions))
{
var repository = new ProductRepository(context);
var product = repository.GetById(1);
Assert.NotNull(product);
Assert.Equal("Product1", product.Name);
}
}
[Fact]
public void Add_AddsProductToDatabase()
{
using (var context = new AppDbContext(_dbContextOptions))
{
var repository = new ProductRepository(context);
var newProduct = new Product { Id = 3, Name = "Product3", Price = 30 };
repository.Add(newProduct);
var product = repository.GetById(3);
Assert.NotNull(product);
Assert.Equal("Product3", product.Name);
}
}
[Fact]
public void Update_UpdatesExistingProduct()
{
using (var context = new AppDbContext(_dbContextOptions))
{
var repository = new ProductRepository(context);
var product = repository.GetById(1);
product.Name = "UpdatedProduct";
repository.Update(product);
var updatedProduct = repository.GetById(1);
Assert.Equal("UpdatedProduct", updatedProduct.Name);
}
}
[Fact]
public void Delete_RemovesProductFromDatabase()
{
using (var context = new AppDbContext(_dbContextOptions))
{
var repository = new ProductRepository(context);
repository.Delete(1);
var product = repository.GetById(1);
Assert.Null(product);
}
}
}