2011-02-18 144 views
3

我在asp.net mvc中創建基於節點的web CMS系統。域對象擴展方法中的依賴注入

閱讀了一些關於依賴注入的書籍後,我將解決方案分解爲多個項目並使用抽象(抽象類和接口)。

我無法弄清楚如何解決以下類型的代碼在我的web項目:

myDomainObjectNode.GetChildNodes<SomeSubNodeClass>(); 

我能做到這一點,如果域對象有一個INodeRepository的參考,但是這將意味着我必須在所有域對象中執行這種依賴關係,這很麻煩,尤其是在創建新實例時。在域對象中有依賴關係(主要是存儲庫)是一件壞事?

我的另一個想法是實現這種使用擴展方法。但是,擴展方法在靜態類上是靜態的,靜態類本身不能使用IoC構造。我可以使用Singleton爲INodeRepository解決此問題,並由IoC設置它。

這不像是一個優雅的解決方案......你有任何其他想法或輸入?

謝謝!

回答

0

我最終解決了這個問題,使用MVC DependencyResolver在MVC Web項目的擴展方法中獲取INodeService。像魅力一樣工作,我不認爲我打破了任何嚴重的OO模式。

1

我通常避免給域對象訪問存儲庫並儘可能隱藏任何持久性問題。

當你創建你的myDomainObjectNode時,你也可以填充一個保存具體對象引用的子節點集合。這通常是建築商或工廠關心的問題。

我可能會刪除通用類型來過濾集合,只使用Linq,您的childnodes集合可能會返回IEnumerable<BaseNode>

當然,您可以使用各種延遲加載和緩存策略來加強它,典型的ORM可以幫助您。

如果您確實決定使用您的域對象中的存儲庫,我希望通過構造函數注入它。這使得依賴明確,並且將它的範圍外化。

+0

謝謝您的輸入! 我的存儲庫不需要知道要創建什麼類型(子類)?另外,我已經很多代碼看起來像myDomainObjectNode.GetChildNodes ();並非常喜歡它。我真的很喜歡能夠編寫這樣的代碼的一個很好的解決方案:) – hakksor 2011-02-23 09:53:24