Automapper - 如何在解析器中查找数据库

时间:2014-04-28 14:56:23

标签: automapper resolver

要解析automapper.config中的某些字段,我必须对数据库进行查找。在解析器类中,我不会'有任何数据库连接。是否可以将数据库连接传输到解析程序类?

AutoMapper.Mapper.CreateMap<entityDevice, dtoDevice>()
    .ForMember(dest => dest.deviceColor, opt => opt.ResolveUsing((source) => { return MyTools.GetDeviceColor(**dbConnection**, source.DeviceId); }));

1 个答案:

答案 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中你可以设置你想要避免在每个映射(例如缓存)中访问数据库的任何优化,但你真的不应该在它之外设置连接。