Можете да използвате мързеливо зареждане, така че Roles
колекцията се зарежда само ако е необходимо. Това се прави чрез инжектиране на хранилище за роли във вашия FullEmployee
субект.
Можете също така да заредите ролите веднъж завинаги:поддържайте речник на ролите във вашия FullEmployeeMapper
и го попълнете, докато се зареждат, след което го проверете, преди да направите заявка към кеша. Надяваме се, че пресъздавате екземпляр за всяка единица работа, така че речникът ще бъде свеж за всяка нова работа и ще избегнете проблеми с многонишковостта.
Примерно изпълнение с 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;
}
}