Eπιλογή μεταξύ Repository Pattern και Helper Static Class

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • MyrinNew
    Senior Member
    • Feb 2024
    • 5168

    #1

    Eπιλογή μεταξύ Repository Pattern και Helper Static Class

    Η επιλογή μεταξύ Repository Pattern και Helper Static Class εξαρτάται από το τι προσπαθείς να πετύχεις.


    Ας δούμε πότε πρέπει να χρησιμοποιήσεις το καθένα:


    1️⃣ Repository Pattern


    ✅ Χρησιμοποίησέ το όταν:

    ✔ Θέλεις να διαχειριστείς την πρόσβαση στη βάση δεδομένων με καθαρό και οργανωμένο τρόπο.

    ✔ Χρειάζεσαι αφαίρεση (abstraction) μεταξύ του business logic και της βάσης δεδομένων.

    ✔ Θέλεις να εφαρμόσεις το Unit of Work Pattern για καλύτερη διαχείριση των συναλλαγών.

    ✔ Θέλεις να μπορείς να κάνεις mocking σε unit tests (π.χ. μέσω dependency injection).


    📌 Παράδειγμα Repository Pattern στη C#






    // 1️⃣ Δημιουργία ενός interface που ορίζει τις βασικές λειτουργίες
    public interface IProductRepository
    {
    IEnumerable
    GetAll();
    Product GetById(int id);
    void Add(Product product);
    void Update(Product product);
    void Delete(int id);
    }

    // 2️⃣ Υλοποίηση του repository που διαχειρίζεται τη βάση δεδομένων
    public class ProductRepository : IProductRepository
    {
    private readonly ApplicationDbContext _context;

    public ProductRepository(ApplicationDbContext context)
    {
    _context = context;
    }

    public IEnumerable
    GetAll() => _context.Products.ToList();

    public Product GetById(int id) => _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();
    }
    }
    }

    // 3️⃣ Χρήση του Repository μέσω Dependency Injection
    public class ProductService
    {
    private readonly IProductRepository _productRepository;

    public ProductService(IProductRepository productRepository)
    {
    _productRepository = productRepository;
    }

    public void ProcessProducts()
    {
    var products = _productRepository.GetAll();
    foreach (var product in products)
    {
    Console.WriteLine($"Product: {product.Name}");
    }
    }
    }







    🎯 Πλεονεκτήματα του Repository Pattern

    ✅ Απομόνωση του business logic από τον database access κώδικα.

    ✅ Ευκολία στη συντήρηση και επαναχρησιμοποίηση του κώδικα.

    ✅ Υποστηρίζει Unit Testing, αφού μπορούμε να κάνουμε mock τα repositories.




    2️⃣ Static Helper Class


    Χρησιμοποίησέ το όταν:

    ✔ Θέλεις να γράψεις βοηθητικές μεθόδους που δεν εξαρτώνται από κατάσταση (state) και δεν χρειάζονται εξωτερικές εξαρτήσεις.

    ✔ Θέλεις μια απλή και γρήγορη λύση για κοινές λειτουργίες όπως formatting, calculations, string manipulation κ.λπ.

    ✔ Δεν χρειάζεται να κάνεις mocking για Unit Testing.


    📌 Παράδειγμα Static Helper Class στη C#






    public static class StringHelper
    {
    public static string ToTitleCase(string input)
    {
    if (string.IsNullOrWhiteSpace(input))
    return string.Empty;

    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(in put.ToLower());
    }

    public static bool IsValidEmail(string email)
    {
    return Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$");
    }
    }

    // Χρήση της static class
    string title = StringHelper.ToTitleCase("hello world"); // "Hello World"
    bool isValid = StringHelper.IsValidEmail("test@email.com"); // true







    🎯 Πλεονεκτήματα της Static Helper Class

    ✅ Απλή και γρήγορη χρήση, χωρίς ανάγκη για instantiation.

    ✅ Ιδανική για utility functions, όπως string manipulations ή μαθηματικές πράξεις.

    ✅ Δεν απαιτεί Dependency Injection.


    📌 Πότε να χρησιμοποιήσεις το καθένα;


    Πίνακας σύγκρισης Repository Pattern vs Static Helper Class

    Χρήση με βάση δεδομένα ✅ Ναι, ενδείκνυται για data access ❌ Όχι, δεν έχει πρόσβαση σε DB
    Stateful λειτουργίες ✅ Ναι, χρησιμοποιεί context για data access ❌ Όχι, δεν έχει κατάσταση (stateless)
    Ευκολία Mocking/Testability ✅ Μπορεί να γίνει mocking για Unit Tests ❌ Δύσκολο να γίνει mock λόγω static nature
    Αποσύνδεση εξαρτήσεων (Decoupling) ✅ Παρέχει abstraction και dependency inversion ❌ Συχνά δημιουργεί tight coupling
    Utility Functions (π.χ. string formatting, calculations) ❌ Όχι, είναι overkill για τέτοιες εργασίες ✅ Ιδανική για τέτοιες περιπτώσεις
    Χρειάζεται Dependency Injection; ✅ Ναι, το repository περνιέται μέσω DI ❌ Όχι, οι static classes καλούνται άμεσα


    🎯 Συμπέρασμα

    ✔ Χρησιμοποίησε το Repository Pattern όταν έχεις ανάγκη για data access abstraction, dependency injection και unit testing.

    ✔ Χρησιμοποίησε Static Helper Class όταν έχεις απλές utility functions που δεν εξαρτώνται από δεδομένα και κατάσταση.


    📌 Αν ο στόχος σου είναι η επεκτασιμότητα και η καθαρή αρχιτεκτονική, τότε το Repository Pattern είναι η καλύτερη επιλογή. Αν απλά χρειάζεσαι γρήγορες βοηθητικές συναρτήσεις, μια static class είναι πιο αποδοτική. 🚀

    Δείτε επίσης: Repository Pattern στη C# με SOLID αρχές


    Δείτε επίσης: Repository Pattern στη C# με SOLID αρχές




    More...
Working...