2015-04-01 78 views
2

我已經看過了源代碼,我沒有找到任何東西(雖然我不是很擅長IL),但我想看看是否有一種方法可以提供Dapper類實例,而不是總是實例化一個新的一。原因是我們有時可能會對兩個不同的存儲過程進行兩次單獨調用 - 一次返回一個「實體」列,另一個返回其他列。但是,我們不是使用我們在第一次調用中收到的實體進行第二次查詢,而是獲得兩個本質上相同的實體。對於Dapper來說,使用現有的實體類並將查詢結果映射到現有的類會更加可取。向Dapper提供一個類實例來映射到,而不是總是實例化一個新實例?

是否有任何方法來攔截Dapper的類實例化,以便在需要時爲其提供現有實例?

回答

1

優秀的問題。目前,它可以讓你指示特定構造,但它總是new S:

il.Emit(OpCodes.Newobj, specializedConstructor); 

我們可能做的是使人們有可能指定一個構造函數或static工廠方法;我懷疑這只是對核心實現者代碼和其他一些地方的三行更改。不是不可能的,但它然後進入問題如調用上下文:如何向工廠提供調用者指定的上下文。再說一遍:所有可能的(protobuf-net幾乎都是一樣的)。

但今天並不存在。這不是不可能的。

+0

謝謝馬克!情況是一個很好的問題。只是一個快速的想法,但是如何爲可充當實例化回調的Query <>()方法添加一個可選的Func 參數?如果沒有設置,Dapper會回退到總是新的()。 – Amberite 2015-04-01 22:10:26

+0

@Amberite好吧,它比這更復雜 - 特別是考慮到多類型方法的存在。讓我想想最適合的實現。尤其要注意的是,委託實例不能方便地用於基於IL的元編程;它可以完成,但涉及創建包裝實例和支持領域等 – 2015-04-01 22:15:37

+0

如果Func <>接受一個常規的類型參數,那麼我不認爲多地圖方法會是一個問題?每種類型都會調用一次回調函數。但是IL問題肯定是一個大問題。我現在要回答這個問題。我會繼續關注Github回購以及如果你想出一些東西,這個線程:) – Amberite 2015-04-01 22:23:15