2013-01-19 231 views
5

有沒有辦法用EF6注入自定義對象實例創建者? 我需要做的是在實體化之前向EF提供實體實例。自定義實體實現

基本上我希望能夠用非無參數構造函數定義我的POCO實體,所以爲了能夠使用DI聚集,最後是用EF持久化的。

我有,我可以用ObjectMaterialized事件achive類似的東西:

var oc = (this as IObjectContextAdapter).ObjectContext; 
oc.ObjectMaterialized += (s, e) => 
{ 
    //resolve and inject dependencies here using e.g. public properties 
}; 

,但我真的很想對構造函數聲明的依賴性。

有什麼想法? 歡呼聲, .m

+0

如果我可能會問,你想注入什麼樣的依賴關係? –

+0

我的域模型中的基本域服務聚合。我來自MongoDB和RavenDB的經驗,其中一個領域模型堅持存儲是非常容易的,並且在反序列化時注入dependencis非常容易,所以我想要進行一下,如果我可以對EF6(alfa2目前)。基本上我試圖找到一種方法來告訴EF使用我的容器來解析實體,或者至少問我如何解決實體:-) –

回答

4

使用默認的ObjectContext,我不認爲這是可能的看過EF代碼。最終,對象由ObjectContext.CreateObject創建。這會做兩件事之一:它要麼調用默認構造函數,要麼,如果啓用代理創建,它會創建相關的代理類型。代理類型用於增強更改跟蹤和延遲加載屬性。

但是,ObjectContext.CreateObject是虛擬的,所以可以在派生類中重寫它。該派生類將提供對容器(或生命週期範圍)的引用,然後在重寫的CreateObject調用中,這將用於解析該實體。

現在的問題是,如何指定派生類型爲ObjectContext用於DbContext?那麼,應該使用a constructor that takes an instance of the ObjectContextDbContext

這是我的想法開始有點離譜的地方,因爲ObjectContext本身需要to be told關於它在連接字符串中使用的模型。我認爲這可能意味着代碼優先的方法將不起作用,因爲模型是懶惰創建的,因此在構建DbContext之前無法使用。但是,對於模型第一種方法,也許這可行?