2014-04-28 66 views
0

來解決automapper.config中的一些字段,我必須做一個查詢數據庫。在解析器類中,我沒有任何數據庫連接。是否有可能將數據庫連接傳輸到解析器類?Automapper - 我如何做一個解析器的數據庫查詢

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

回答

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都會發生同樣的事情;定義範圍內的變量可用於定義,並將在執行時解決。

在你的情況,你可以定義你的連接你映射的外面並把它傳遞到拉姆達執行:

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內部,你可以設置任何優化,以避免在每個映射中觸及數據庫(例如高速緩存),但你不應該將連接設置在它之外。

相關問題