2011-01-06 65 views
1

我需要一些膠帶...我有一個場景,其中由兩個單獨的數據庫(在不同的服務器上)支持的兩個對象需要相互關聯。我有了對象圖,但由於其他應用程序的「功能」,我不能依靠O/RM來映射關係;當我得到一個或另一個類實例時,我必須手動填充特定的關係。使用IoC在實例化時修改對象

我有幾個擴展方法可以幫助解決這個問題,但現在我正在盯着尋找應用程序中所有需要現在調用該擴展方法的地方的漫長道路,我試圖找到一種方法,當其中一個對象被實例化時,在全局層面上實現它。由於前面提到的「功能」創建的原因,無法在對象構造函數中使用它。

有沒有一種方法可以讓我在實例化特定對象(不一定是DI類型的場景)時使用IoC容器捕獲/陷阱,並在該對象使用之前對其進行修改?像某種「OnActivated」事件處理程序?

抓住吸管的種類,我知道...值得一提的是,這個應用程序是MVC 2,使用NHibernate,Autofac和大量的吐痰和軟骨。

+0

你看過這個問題嗎? http://stackoverflow.com/questions/340461/dependency-injection-with-nhibernate-objects – 2011-01-06 18:06:14

回答

2

你的意思是除了Autofac的OnActivated事件嗎?

例如爲:

var builder = new ContainerBuilder(); 

builder.RegisterType<MyComponent>() 
    .OnActivated(e => DoSomething(e.Instance)); 
+0

我在看,但由於類型本身並沒有實際被注入,我不確定OnActivated會觸發。我應該嘗試過,但是... – nkirkes 2011-01-06 21:11:42

0

你認爲你想要的不是真正的IoC工作,並且沒有任何真正的方法可以在運行時在任何地方觀察一類對象的實例化,而無需集中創建這些對象的位置。

如果您需要實例化一個對象或其他對象,並在該過程中確保其他對象被實例化並被第一個引用,我認爲最好的模式應該是一個工廠,可能由IoC通過註冊工廠方法。然後,創建這些對象的對象將被賦予對工廠方法或工廠本身的處理(工廠可以在容器中作爲單個作用域,並且只是對各個工廠的引用)。

+0

根據你的建議開始沿着這條路走下去,但它證明有其他嘗試有類似的限制。可能是我的執行,我... – nkirkes 2011-01-06 23:22:48

0

我不認爲你可以使用IOC做那樣的事情。我假設你不能改變這個類的實現。您可以使用像postsharp這樣的工具來實現此目的。有了它,你應該能夠攔截對構造函數的調用並向它們注入自定義代碼。

1

夫婦給予相應的答案,但想後我的解決方案,以及,這繞過的IoC完全。代表們去救援!

因爲我確實有修改主要實體的能力,所以我添加了一個靜態Func<T>屬性,期望從我的第二個程序集/數據庫返回一個類的實例。我還爲流氓類型創建了一個getter,如果它不爲null,它只是調用委託。在我的應用程序啓動(global.asax在我的情況),然後我將靜態Func設置爲一個適當的方法。瞧!我擁有我渴望的對象圖,並且有效地繞過了現有架構的侷限性,而沒有不必要的依賴關係。