Come evitare il pattern LoadBy?

4

Nel nostro codebase per un sistema sofisticato che controlla molti aspetti delle aziende, abbiamo una certa legge non scritta che non si spaventa nel codice con SQL complicato, invece di scriverlo in una funzione nella classe dell'entità per centralizza l'accesso al database e questo ottimo modello diventa pagine e pagine di

class Car:
    List<Car> LoadByManufacturerId(id);
    List<Car> LoadByModelId(id);
    List<Car> LoadByCountryId(id);
    List<Car> LoadByCityId(id);

    Car LoadByChassis(chassis);
    Car LoadById(id);
    Car LoadByCountryIdAndChassis(countryId, chassis);
    Car LoadByPersonIdAndIndex(personId, index);

Come sempre, ogni volta che qualcuno deve fare una query con un nuovo parametro, viene creato un nuovo metodo, ma questo è solo metà del problema: molte volte le persone non prendono il tempo di guardare il codice prima di crearne uno (la documentazione è inesistente) e finisce per creare più versioni della query con lo stesso nome, duplicando il codice tutt'intorno.

Siamo in un progetto C #, ma molti sviluppatori non comprendono molto LINQ oltre il basic from s in tablename where blabla select s , quindi qual è il modo migliore per ridefinire questo pattern in qualcosa che non è così incline a questo tipo di problemi con minimo attrito?

    
posta Délisson Junio 29.10.2015 - 18:38
fonte

3 risposte

5
  1. Se stai scrivendo un repository, i tuoi metodi di repository dovrebbero essere strutturati attorno ai processi di business, non ai metodi CRUD.

  2. Scrivere Linq invece di questi metodi non è poi così difficile e puoi combinare le condizioni.

    var result = Cars.FirstOrDefault(x => x.ManufacturerID == manufacturerID 
          && x.ModelID == modelID);
    

Ulteriori letture
P di EAA: repository
Il modello del repository

    
risposta data 29.10.2015 - 19:00
fonte
1

Non penso che ci sia una buona soluzione tecnica. Consiglio sempre un modello di query , ma questo sposta semplicemente il problema da "aggiungi metodo" a "aggiungi classe", anche se in OCP modo.

Quindi l'unica opzione possibile è la soluzione per le persone. Se le persone non capiscono LINQ, allora insegnale. Avere una formazione settimanale o anche giornaliera su come utilizzare LINQ. Motivali a impararlo da soli e provalo. Identifica le persone che lo capiscono e chi sarà pronto ad aiutare gli altri se non capiscono nulla. Esegui una revisione del codice del codice DB, in modo che i duplicati possano essere identificati. Scegli le persone che saranno responsabili per il codice DB e che cercheranno il codebase, il fixing, il codice di deduplicazione e di refactoring. Motivare le persone a cercare la soluzione esistente prima di aggiungerne una.

    
risposta data 29.10.2015 - 21:44
fonte
0

Perché non utilizzare il Specifica modello?

Quindi sarai in grado di passare solo la specifica al metodo Repository di loadBySpecification() .

    
risposta data 30.10.2015 - 14:56
fonte

Leggi altre domande sui tag