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.