要解析automapper.config中的某些字段,我必须对数据库进行查找。在解析器类中,我不会'有任何数据库连接。是否可以将数据库连接传输到解析程序类?
AutoMapper.Mapper.CreateMap<entityDevice, dtoDevice>()
.ForMember(dest => dest.deviceColor, opt => opt.ResolveUsing((source) => { return MyTools.GetDeviceColor(**dbConnection**, source.DeviceId); }));
答案 0 :(得分:0)
使用lambda时,您可以传递定义lambda时看到的值;这称为闭包,允许将变量提升到lambda中。例如
void call_lambda(Func<int> f)
{
Console.WriteLine("Int value is " + f());
}
/* ... */
void lambda_caller()
{
int i = 150;
call_lambda(() => i);
}
会打印i
的正确值,即使它在call_lambda
的范围内不存在。任何lambda都会发生同样的事情;定义范围内的变量可用于定义,并将在执行时解决。
在您的情况下,您可以在映射之外定义连接并将其传递给lambda以执行:
var dbConnection = createConnection();
AutoMapper.Mapper.CreateMap().ForMember(dest => dest.deviceColor, opt => opt.ResolveUsing((source) => { return MyTools.GetDeviceColor(dbConnection, source.DeviceId); }));
然而有一个问题;通过将变量提升到lambda中,您不会将其控制权移交给lambda。如果在定义映射后关闭连接,则lambda无法执行,因为它知道的连接已关闭。所以我宁愿建议将整个连接设置和查询包装到lambda中,以便控制它。在lambda中你可以设置你想要避免在每个映射(例如缓存)中访问数据库的任何优化,但你真的不应该在它之外设置连接。