遅延読み込みを使用できるため、Roles
コレクションは、必要な場合にのみロードされます。これは、FullEmployee
に役割リポジトリを挿入することによって行われます。 エンティティ。
また、すべてのロールを1回ロードすることもできます。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;
}
}