2011-06-15 25 views
0

我可以看到如何使用autofac實例化類的對象,然後將這些對象傳遞給db4o進行存儲。當我需要從db4o中檢索對象實例時,如何使用autofac註冊對象?如何爲我的Model對象集成db4o和autofac?

我原本打算使用db4o的MSBuild工具來實現透明激活/持久性,但看起來像我可能必須手動實現所有Model對象的IActivatable接口,以便我可以在IActivatable::Bind()當它們被激活時,註冊this指針。

爲了讓事情變得更糟,我預見到IActivatable::Bind()的實現將不得不訪問當前Autofac生存期範圍的Singleton來進行註冊。顯然,我無法將當前生命週期範圍傳遞給db4o正在激活的對象實例。儘管通過示波器的效果不錯,但我可以想象,考慮在公共Singleton中堅持當前生活範圍的人們的呻吟聲。

另一種方法似乎是在當時實現db4o的類型處理程序並攔截對象實例化,但這似乎是撤銷了使用db4o存儲對象的任何好處。

還是我只是有點瘋狂的想法,使用autofac實例化所有對象? (例如,我有一把錘子,一切都看起來像釘子)。模型對象是否應該通過簡單的舊「新」和db4o使用的任何魔法實例化?換句話說,只能在我的View,ViewModel和Controller對象中使用autofac。

回答

3

沒有「真實路徑」:)但這裏推薦的方法是遠離在域模型中直接使用服務,而是將「域事件」分派給啓用了IoC的處理程序。

吉米·博加德有相當數量的這篇文章中的 - 還有,你應該能夠爲Autofac適應的StructureMap的例子:http://lostechies.com/jimmybogard/2010/08/04/container-friendly-domain-events/

(順便說一句,巧合的是,我有一個基於Autofac,例如實現,我打算在接下來的幾個星期內發佈。)

+0

使用域事件看起來像是一種很有前途的方法,但仍然需要我能夠鉤住數據庫中的每個對象負載來觸發事件。對於透明激活而言,如果我必須「處理」激活,那麼它就不再那麼透明瞭,只需要使用autofac註冊實例即可。 – Ants 2011-06-15 17:47:59

+0

@Gamlor的關於使用db4o事件的回答與使用域事件的想法非常吻合。我仍然必須「處理」每個激活,但至少我不會觸及每個域對象的代碼。我只需要調用這個中心的激活事件處理程序。我仍然沒有看到如何擺脫autofac IContainer的傳遞,無論是在DomainEvent.Container中還是在作爲lambda編寫的Activated事件處理程序代碼中。 – Ants 2011-06-15 18:08:42

1

我建議用Autofac實例替換每個'new'。我的經驗法則是當對象需要複雜的依賴關係(不是簡單集合,核心CLR類型,其他簡單對象)時,我讓Autofac完成這項工作。簡單的域對象我通常只使用新的操作符或創建一個工廠。

我不是100%確定,如果我得到您的問題的權利。你想在實例化時將一些服務綁定到域模型上?那麼我建議使用events。您可以使用db4o事件來檢測對象何時被存儲,激活等。在這樣的事件監聽器中,您可以使用當前的Autofac範圍來傳遞其他服務。

Btw。 IActivatable :: Bind()的東西已經由db4o調用。你不需要做其他事情。

一般來說,我會盡量正確地確定一切範圍,而不是濫用Autofac作爲服務定位器。

+0

感謝您指點我的事件,我會看看。正如我在我的問題中提到的那樣,這不是提交部分,我有問題。這是我有問題的加載部分。如果我什麼都不做,只是使用TA,那麼我會有裝載到內存中的對象,這些對象沒有使用autofac註冊。我知道IActivatable :: Bind()在加載時由db4o調用,這就是爲什麼我正在使用它作爲使用autofac註冊對象的機會。正如我還指出的,我想避免使用autofac作爲服務定位器。 – Ants 2011-06-15 17:45:22

+0

看看事件註冊表API,我看到有一個激活事件。更好的是,這與Nick建議的域名事件概念很相符。它仍然看起來像我需要autofac IContainer可用於我的激活處理程序。另一方面,這看起來不像觸摸我的每個域對象的代碼那麼麻煩。 – Ants 2011-06-15 18:03:38