Ce este IEntity în acest cod pentru un model de depozit generic? (Programare, Generice, Modele De Design, Interfață, Model De Depozit)

TreK a intrebat.

Am văzut acest cod în câteva locuri. Ce face IEntity în codul de mai jos? Știu că IEntity nu este o interfață, chiar dacă este prefixată cu „I”. În plus, înțeleg că ar putea acționa ca un ID pentru entitățile returnate de la depozit. Când ar trebui să fie setat acest ID? Caut o explicație bună a utilizării IEntity ca interfață și a modului în care se raportează la „T”.

Cod din: http://blog.falafel.com/implement-step-step-generic-repository-pattern-c/

public class IEntity
{
    public string Id; 
}

public interface IRepository<T> where T: IEntity
{

    IEnumerable<T> List { get; }
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    T FindById(int Id);

}

Comentarii

  • Servește ca o constrângere asupra lui T. Numai clasele derivate din IEntity pot fi folosite pentru a crea un depozit prin intermediul clasei generice. Dacă încercați să creați un depozit cu o clasă care nu derivă din IEntity, veți primi o eroare de compilare. –  > Por dbugger.
  • Vă mulțumim că ați subliniat acest lucru. Aveți vreo idee de ce acționează ca o constrângere? –  > Por TreK.
  • Pentru a se asigura că clasa are tot ce are nevoie depozitul. –  > Por dbugger.
1 răspunsuri
Matías Fidemraizer

Este o constrângere generică a parametrilor de tip pentru a defini ce tip de entități pot gestiona un depozit.

Adică, TEntity este IEntity sau orice clasă derivată, dar cel puțin TEntity referințe vor obține acces în timp de compilare la IEntity membrilor. Aceasta este o îmbunătățire uriașă deoarece nu mai este nevoie să efectuați verificări de tip în timp de execuție înainte de a distribui o referință, deoarece nu mai aveți nevoie de o distribuție.

De exemplu, Add(TEntity) fără generice ar arăta ca Add(Entity) ceea ce ar forța timpul de execuție să efectueze o verificare upcast (de ex. Add(new DerivedEntity()) care face upcasting DerivedEntity la Entity).

Atunci când se utilizează generice, un IRepository<DerivedEntity> va compila Add ca Add(DerivedEntity), deci, unde se află cast-ul în momentul în care se adaugă o entitate de tip DerivedEntity? 😉

Când ar trebui să fie stabilit acest ID?

De obicei, implementarea depozitului ar trebui să seteze ID-ul TEntity.Id:

public void Add(TEntity entity)
{
    // "entity" reference can access TEntity.Id because TEntity is
    // at least IEntity
    entity.Id = Guid.NewGuid().ToString();
}

Comentarii

  • Este aceasta cheia primară a bazei de date? De exemplu, dacă am un câmp de identitate în tabelul din baza de date (numit Id), pot sări peste apelul din Add(TEntity entity) și să îl setez în metoda Get? –  > Por TreK.
  • @TravisK În cazul meu, încerc să evit să folosesc câmpuri de identitate dar urmez strategia guidcomb, care, pe scurt, generează identificatorii în stratul de aplicație și nu în baza de date…BTW da, puteți sări peste setarea întregului câmp Id din moment ce folosiți un câmp identitate, și toate obiectele returnate de primește ar trebui să fie completate cu întregul Id deja stabilite –  > Por Matías Fidemraizer.