Puoi utilizzare il caricamento lento quindi Roles
la raccolta viene caricata solo se necessario. Questo viene fatto iniettando un repository di ruoli nel tuo FullEmployee
entità.
Puoi anche caricare i ruoli una volta per tutte:mantieni un Dizionario dei ruoli nel tuo FullEmployeeMapper
e riempilo mentre vengono caricati, quindi controllalo prima di interrogare la cache. Si spera di ricreare un'istanza per ogni unità di lavoro in modo che il dizionario sia aggiornato per ogni nuovo lavoro ed eviti problemi di multithreading.
Esempio di implementazione con un 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;
}
}