Vous pouvez utiliser le chargement paresseux donc Roles
la collection est chargée uniquement si nécessaire. Cela se fait en injectant un référentiel de rôles dans votre FullEmployee
entité.
Vous pouvez également charger les rôles une fois pour toutes :conservez un Dictionnaire des rôles dans votre FullEmployeeMapper
et remplissez-le au fur et à mesure de leur chargement puis vérifiez-le avant d'interroger le cache. J'espère que vous recréez une instance pour chaque unité de travail afin que le dictionnaire soit frais pour chaque nouveau travail et que vous évitiez les problèmes de multithreading.
Exemple d'implémentation avec une List
:
class FullEmployeeMapper : IMapToNew<Employee, FullEmployee>
{
private List<FullRole> _roles = new List<FullRole>();
public FullEmployee Map(Employee source)
{
FullEmployee employee = new FullEmployee()
{
Id = source.Id,
Age = source.Age,
BirthDate = source.BirthDate,
Name = source.Name
};
var mapper = new FullRoleMapper();
var client = new RedisClient("localhost");
employee.Roles = _roles.Where(r => source.Roles.Contains(r.Id)).ToList();
if (employee.Roles.Count != source.Roles.Count)
{
var newRoles = client
.As<Role>()
.GetByIds(source.Roles.Except(employee.Roles.Select(r => r.Id)))
.Select(r => mapper.Map(r)))
.ToList();
employee.Roles.AddRange(newRoles);
_roles.AddRange(newRoles);
}
return employee;
}
}