Comprensione del modello di deposito generico

4

Sto cercando di capire l'implementazione del repository generico. Ho visto questa linea (o simile ad essa) in molti esempi:

public interface IRepository<TEntity> : IDisposable where TEntity : IEntity

Alcuni possono spiegare le parti a questo? Inoltre, sto attraversando un periodo difficile per capire l'identità e il modo in cui viene riprodotta nell'interfaccia.

public interface IEntity
    {
        int Id { get; set; } 
    } 

public interface IRepository<TEntity> : IDisposable where TEntity : IEntity
    {
        IQueryable<TEntity> GetAll();
        void Delete(TEntity entity);
        void Add(TEntity entity);
    } 
    
posta TreK 12.01.2016 - 07:27
fonte

1 risposta

4

Partendo dal basso; se vuoi sapere se due valori sono uguali, basta controllare che siano uguali. Pensa a 7. Qualunque cosa accada tra ora e la morte termica dell'universo, 7 non andrà mai uguale a 2.

D'altra parte, le entità cambiano. Oggi, Bob è 2. Nel tempo stabilito, Bob avrà 7 anni. Anche se non è più 2, è ancora Bob. Questa è l'identità, la cosa che usiamo per collegare diversi stati della storia nel tempo. Metti un modo leggermente diverso, se vogliamo sapere se "Bob" e "il ragazzo nel cappello" sono la stessa persona, non chiediamo la loro età, oi loro nomi (che potrebbero essere coincidenti), controlliamo la loro identità .

Quindi IEntity è un'interfaccia che definisce un'identità. In implementazioni di esempio come questa, la cosa reale che stai modellando (Persona) implementerà IEntity, e avrà qualche id: int come parte del suo stato. (Un id settabile è piuttosto strano, l'id è solitamente immutabile)

L'interfaccia IRepository, ora, promette che può essere smaltita e anche che i metodi supportati sono tutti corrispondenti a un tipo coerente (ma non ancora specificato). Tuttavia, il tipo è limitato: questa interfaccia per i repository promette che il tipo sarà uno che implementa IEntity.

quindi potresti vedere

class Dog : IEntity {
    ...
}

class Person : IEntity {
    ...
}

e corrispondenza dei repository

class DogRepository : IRepository<Dog>
{
    IQueryable<Dog> GetAll();
    void Delete(Dog entity);
    void Add(Dog entity);
} 

Ma non vedrai, per esempio

class AgeRepository : IRepository<Age> {
    ...
}

Perché Age, essendo un valore, non implementerà IEntity.

    
risposta data 12.01.2016 - 07:58
fonte

Leggi altre domande sui tag