Du kan använda lazy loading så Roles
samling laddas endast om det behövs. Detta görs genom att injicera ett rollförråd i din FullEmployee
enhet.
Du kan också ladda rollerna en gång för alla:håll en ordbok över roller i din FullEmployeeMapper
och fyll det när de laddas och kontrollera det innan du frågar cachen. Förhoppningsvis återskapar du en instans för varje arbetsenhet så att ordboken blir fräsch för varje nytt arbete och du undviker problem med flera trådar.
Exempelimplementering med en 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;
}
}