Je les référentiels suivants:Référentiels conception confusion
EmployeeRepository
DocumentRepository
CourseRepository
LeaveRepository
Nous avons une exigence maintenant d'ajouter un nouvel objet métier appelé BusinessTripBidding
qui permet à l'employé s d'enchérir pour différents voyages d'affaires et ainsi. Quoi qu'il en soit, le problème est lorsque vous renvoyez la liste de Bidders
J'ai besoin d'inclure des informations de tous les dépôts mentionnés ci-dessus que l'entreprise exige, puis je génère un nouvel objet et retourne une liste (dans mon objet métier), quelque chose comme:
IEnumerable<BidderInfo> GetBiddersInfo(int tripId)
{
List<Bidder> bidders = _bidderRepository.GetListByTripId(tripId);
List<Course> courses = _courseRepository
.GetListByEmployeeId(bidders.Select(b => b.EmployeeId).AsEnumerable());
List<Document> passports = _documentRepository
.GetListByEmployeeId(bidders.Select(b => b.EmployeeId).AsEnumerable(), DocumentType.Passport);
List<Leave> leaves = ...........
var biddersInfo = new List<BidderInfo>();
foreach(Bidder b in bidders)
{
var bi = new BidderInfo();
bi.Courses = courses.Where(c => c.EmployeeId == b.EmployeeId).ToList();
bi.Passport = passports.FirstOrDefault(p => p.EmployeeId == b.EmployeeId);
bi.ComingLeave = .........
// the same for the rest of the repositories
biddersInfo.Add(bi);
}
return biddersInfo;
}
a côté des multiples appels à la db, et à côté de la boucle, il serait beaucoup plus facile si je crée un nouveau référentiel seul responsable pour créer cette BidderInfo
en une seule requête, nous allons l'appeler BidderInfoGeneratorRepository
puis injecter ce dépôt dans le constructeur de l'objet métier. Maintenant, devrais-je garder les choses comme je le fais actuellement (plusieurs appels db) mais les choses semblent correctes; ou devrais-je créer un autre référentiel et le transmettre à l'objet métier pour accélérer les choses? Quelle est la meilleure pratique dans ce cas?
'sans une forte augmentation de la complexité du code' c'est la question ... comment? Mon approche est-elle correcte en créant un nouveau référentiel à cette fin? – Him
Dans ce cas, vous pouvez créer un nouveau référentiel. Deux petites choses: vous filtrez vos parcours deux fois quand je le vois correctement. Deuxièmement: je n'appellerais pas ToList() sur la définition de bi.Courses, car elle diminue la performance. – Dexion
Le premier filtre est d'obtenir la liste des cours pour tous les employés dans cette demande, le GetByEmployeeId a une surcharge qui accepte 'IEnumerable'. Le deuxième filtre est d'obtenir l'employé spécifique. –
Him