Genera GUID in ciascun respository per creare un metodo?

0

Dire che ho un sacco di repository:

CustomerRepository();
SalesRepositor();
EmployeeRepository();
etc

Supponiamo che ognuno di questi abbia un metodo di creazione, ad esempio. Il repository clienti potrebbe essere:

public void Add(Customer entity)
{
    _dbContext.Set<Customer>().Add(entity);
}

Dire che volevo utilizzare un GUID per tutti gli ID entità. Dove metterei la seguente logica:

entity.id = Guid.NewGuid();

Lo inserirò in ogni repository creando un metodo o c'è un posto "migliore"?

    
posta w0051977 04.08.2017 - 16:34
fonte

1 risposta

2

No, il repository non è il posto migliore per la creazione di guid; con quello detto, potrei pensare a molti più gravi peccati se hai una ragione convincente per farlo.

Il lavoro del repository è semplicemente quello di astrarre il livello dati. Non correlato alla tua domanda, i tuoi repository non riescono a farlo, il che potrebbe essere il motivo per cui sei arrivato a questa domanda in primo luogo.

Per essere sinceri, i repository che stai usando sono inutili codice in questo momento. Non fanno altro che aggiungere una complessità inutile. Le classi EF rappresentano i dati nel DB, quindi utilizzarli direttamente nel codice rende l'applicazione strettamente vincolata al DB.

Il lavoro del tuo repository consiste nel mappare quelle entità a un oggetto business creato da te. Se ritieni che questo compito non sia necessario per il tuo progetto (si spera, perché si tratta di una semplice app CRUD), non dovresti complicarlo troppo definendo i repository. Se ci pensi, DBContext è già un repository.

Tornando alla tua domanda, il punto di creare una chiave nel codice al posto del DB è di consentire alla tua applicazione di rendere la propria chiave non gravata dall'accesso ai dati di complessità; pertanto, farlo nel repository è piuttosto controproducente, poiché l'intero lavoro di un repository è l'accesso ai dati.

Inoltre, un avviso, i GUID sono notoriamente lenti per gli indici cluster. Non esiste una regola che dice che potresti avere solo una chiave unica. Forse, considera un GUID per la chiave logica dell'applicazione e un numero intero di identità definito dal tuo database.

In sintesi, avere il tuo repository per creare il tuo GUID non è grandioso, ma è lontano dalla cosa più fastidiosa del codice precedente. Un posto migliore sarebbe in un costruttore, fabbrica, o qualsiasi altro codice inizializzasse il nuovo oggetto.

Ecco un esempio di un repository più utile:

class CustomerRepository
{
     public BusinessModel.Customer GetCustomer(Guid customerId)
     {
         Customer entity = _dbContext.Customers.Where(c => x.id == id).Single();
         return new BusinessModel.Customer
         {
             Id = entity.Id,
             Name = entity.Name
             // TODO: More properties
         }
     }

     // TODO: Create, update, delete, ect methods
}
    
risposta data 04.08.2017 - 16:54
fonte

Leggi altre domande sui tag