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.