आप आलसी लोडिंग का उपयोग कर सकते हैं ताकि 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;
}
}