Bạn có thể sử dụng tính năng tải chậm để Roles
bộ sưu tập chỉ được tải nếu cần. Điều này được thực hiện bằng cách đưa một kho lưu trữ vai trò vào FullEmployee
của bạn thực thể.
Bạn cũng có thể tải các vai trò một lần cho tất cả:giữ một Từ điển về các vai trò trong FullEmployeeMapper
của bạn và điền vào khi chúng được tải, sau đó kiểm tra trước khi truy vấn bộ đệm. Hy vọng rằng bạn tạo lại một phiên bản cho mỗi đơn vị tác phẩm để từ điển sẽ luôn mới mẻ cho mỗi tác phẩm mới và bạn tránh được các vấn đề về đa luồng.
Triển khai mẫu với 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;
}
}