Evita il core layer che fa riferimento a DAL quando si definisce l'interfaccia del repository

2

Sto cercando di imparare l'architettura N-Layer e molte altre cose, e ho una soluzione C # in cui ho i seguenti livelli:

  • Core/Infrastructure (Folder)
    • Core (Project)
      • Service interfaces
      • Domain models
      • Repository interfaces
  • Business Logic Layer (Folder)
    • Services (Project)
      • Different services
  • Data Access Layer (Folder)
    • DatabaseAccess (Project)
      • Entities generated via Entity Framework from existing database
      • Different repositories
  • Presentation Layer (Folder)
    • Shell (Project using Prism)
    • Different modules (Multiple projects acting as prism modules)

Questa impostazione sembra corretta?

Dovrebbe quasi imitare la seguente immagine:

Quandostrutturatoinquestomodo,sembramoltoliberamenteaccoppiato,tuttavia,sorgeunproblemaquandovogliodefinireun'interfacciarepositoryperun'entità.IlproblemaèovviamentechedovreifareriferimentoalprogettoDALperutilizzarel'entitànell'interfaccia...Nonriescoacapiredovehosbagliatooqualimisureadottarepercorreggerequestoproblema.

L'interfacciadelrepositorygenericoinCore.Repositories:

publicinterfaceIRepository<TEntity>whereTEntity:class{TEntityGetByID(intID);IList<TEntity>GetAll();IList<TEntity>Find(Expression<Func<TEntity,bool>>predicate);voidAdd(TEntityentity);voidAddRange(IList<TEntity>entities);voidUpdate(TEntityentity);voidRemove(TEntityentity);voidRemoveRange(IList<TEntity>entities);}

Un'interfacciadirepositorydiesempioincuipotrebbesorgereilproblema(ancheinCore.Repositories):

interfaceIChildRepository:IRepository<ChildEntity>//InordertouseChildEntityIwouldhavetoaddareferencetotheDALproject{IList<Child>GetAllChildren();}

Quindi,inconclusione,nondovreiusareloschemadirepositoryinquestocaso,oqualipassipossofarepercorreggereilproblema?

UPDATE:

Unvideocheavevovistosulpatterndelrepositoryerainqualchemodoerratoederalaragionepercuiavevounerrorenellamiacomprensionedelpatterneunerrorenelmiocodice.Hocapitoqualefosseilproblemadallaricercadiunpostsulblogmoltocarinosulmodellodirepository.

Stocreandorepositoryspecifici,mastousandoilrepositorygenericocomehelper,quindinonhobisognodiripeterecosecome"GetAll", "Add" o "Find".

Durante la definizione della mia interfaccia avrei dovuto farlo:

interface IChildRepository
{
    IList<Child> GetAllChildren();
}

E poi nella mia classe:

class ChildRepository : Repository<ChildEntity>, IChildRepository
{
    IList<Child> IChildRepository.GetAllChildren() => GetAll().ToModels();
}

Ovviamente ho bisogno di ripetere alcuni codici come "GetAllChildren", "GetAllParents", & ecc. - Credo che dovrò solo conviverci.

    
posta Helios 13.08.2017 - 21:12
fonte

1 risposta

5

È corretto. ma i repository devono restituire oggetti business, non le "entità" del database

Punto secondario. I repository generici sono in qualche modo disapprovati. È meglio disporre di repository specifici con metodi che ti consentano di sfruttare appieno il database per recuperare i dati esatti di cui hai bisogno.

Schema semplificato

  • Modelli e interfacce (core) senza dipendenze
  • Repository, referenze Modelli
  • App (livello di presentazione?), fa riferimento a Modelli e repository
risposta data 13.08.2017 - 21:40
fonte

Leggi altre domande sui tag