clipboard-list-checkRezumat

Rezumat — Repository Pattern și ListView


1. Separarea straturilor și CRUD

Problema din Lab 04: lista de angajați trăia în Form1, logica de stocare și cea de prezentare erau amestecate. Soluția: trei componente cu responsabilități distincte și dependențe într-o singură direcție.

┌──────────────────────────────────┐
│       Presentation Layer         │
│   Form1, FormCarte               │
│   Ce vede și face utilizatorul   │
└──────────────┬───────────────────┘
               │ foloseste (nu si invers)

┌──────────────────────────────────┐
│        Repository Layer          │
│   CarteRepository                │
│   Intermediar pentru date        │
└──────────────┬───────────────────┘
               │ acceseaza (nu si invers)

┌──────────────────────────────────┐
│          Data Layer              │
│   FakeDatabase                   │
│   List<Carte> Carti (statica)    │
└──────────────────────────────────┘
Concept
Ce înseamnă

FakeDatabase

Simulează sursa de date — repository-ul nu deține date

Repository

Intermediar care expune CRUD — nu deține date, nu știe de UI

Presentation

Gestionează interfața — nu știe cum sunt stocate datele

CRUD

Create, Read, Update, Delete — cele patru operații fundamentale

Direcția dependenței

UI → Repository → FakeDatabase, niciodată invers

2. FakeDatabase și Repository Layer

Concept
Ce înseamnă

static List<Carte> Carti

O singură copie în memorie, accesibilă global

Repository nu deține date

Accesează FakeDatabase.Carti — este intermediar, nu sursă

GetAll() returnează copie

Protejează FakeDatabase.Carti de modificări accidentale

Contor static pentru Id

Fiecare obiect nou primește automat un id unic și imuabil

Fără validare, fără UI

Validarea și mesajele vizuale aparțin prezentării

3. Cum se conectează UI-ul la Repository — instanțiere și problema ei

Varianta din exercițiu — fiecare formular face new CarteRepository() — funcționează în aparență deoarece FakeDatabase.Carti este statică: toate instanțele de repository accesează aceeași listă. Dar această corectitudine este fragilă — dacă sursa de date s-ar schimba, problema ar reapărea.

Soluția robustă, indiferent de sursa de date, este transmiterea prin constructor:

Abordare
Cum funcționează
Avantaje
Dezavantaje

Instanțiere locală

new Repository() în fiecare formular

Simplu

Corect doar cu surse statice; fragil altfel

Transmitere prin constructor

Form1 creează, transmite prin new FormCarte(repo, id)

Explicit, robust

Lanț lung la multe niveluri

Singleton

Repository.GetInstanta() returnează mereu același obiect

Accesibil global

Greu de testat, dependență implicită

Dependency Injection

Container gestionează crearea și livrarea

Flexibil, testabil

Complexitate suplimentară

4. ListView în modul Details

Concept
Ce înseamnă

View = Details

Modul tabel cu rânduri și coloane

ListViewItem

Un rând în ListView

item.SubItems.Add(text)

Textul pentru coloanele 2, 3, 4... — ordinea corespunde ordinii coloanelor

item.Tag = obiect

Stochează referința la obiectul de date — recuperat la selecție

SelectedItems[0].Tag as Carte

Recuperează obiectul fără căutări în repository

RefreshLista()

Golește și repopulează manual după orice modificare

Eveniment
Când se declanșează

SelectedIndexChanged

La schimbarea selecției — activează/dezactivează butoane

DoubleClick

Shortcut pentru editare direct din listă

Last updated