2017-07-13 180 views
3

爲什麼在.NET框架中IDependencyResolverSystem.Web程序集(MvcHttp)耦合?爲什麼IDependencyResolver與System.Web緊密結合?

DI系統的目標不是它應該提供爲客戶提供依賴關係的不可知論方式嗎?如果我想在項目中使用IDependencyResolver,該項目不應引用與System.Web相關的任何內容?

編輯:
這不僅僅是一個有關如何執行請求的哲學問題,因爲我知道有其他選擇,如開源DI庫。

+0

這是一個接口,說它不緊密耦合。您可以使用內置的依賴解析器,這些解析器可以在.net中使用,也可以通過實現'IDependencyResolver'接口來編寫自己的解析器。如果您使用已經擁有自己版本的解析器的Castle Windsor或Unity或Ninject。 –

+1

是System的一部分的IServiceProvider接口。然而,它是一個相當有限的接口 – Slicksim

回答

6

DI系統的目標不是它應該提供一種爲客戶提供依賴關係的不可知論方式嗎?

這是正確的,但在這種情況下,IDependencyResolver是特定於它定義的庫。正是圖書館的DI抽象允許不確定性的可擴展性指向依賴性解決方案。我相信這是抽象的最初目標。

它並沒有真正被其他庫獨立重複使用,這是明顯的,因爲MVCWeb API都有兩個版本。儘管它們具有相同的名稱並且具有相同的目的,但它們的實現略有不同。

它還演示了Mark Seemann在本文中提及的Conforming Container反模式,其中文章還提到上述抽象作爲.NET一致容器的已知示例。即使我的首選方法使用IServiceProvider作出了清單。

如果我想應該 沒有提及相關的System.Web任何一個項目中使用IDependencyResolver?然後

我的建議是不要使用IDependencyResolver的System.Web。我還要補充的是,首先應特別注意遵循適當的設計模式,確保人們理解概念以及應該在何處應用或避免這些概念。

+0

優秀的答案,但我仍然想知道爲什麼'IServiceProvider'沒有在'System.Web'中被重用來代替'IDependencyResolver'? –

+1

這是該系統設計者的問題。但是,他們已經在下面的版本中恢復爲'IServiceProvider',這是我們今天在asp.net-core中的版本。這是爲了消除困擾System.Web的緊密耦合。 – Nkosi

+0

我建議閱讀以下文章:http://blog.ploeh.dk/2014/05/19/conforming-container/ https:// simpleinjector。org/blog/2016/06/whats-wrong-with-the-asp-net-core-di-abstraction/ – BatteryBackupUnit

1

接口IDependencyResolver是System.Web框架的擴展點。框架依賴於這個接口來解析(控制器及其類似的)實例及其依賴關係。

該框架擁有自己的接口實現,但您可以提供自己的接口實現。內置的實現具有有限的功能(外部配置,注入類型,攔截)。

大多數IOC容器和DI框架提供了這個接口的實現,以便您可以將它們集成到現有框架中。

2

爲什麼IDependencyResolver與.NET框架中的 System.Web程序集(Mvc或Http)耦合?

因爲它是一個「他們」用來解析框架服務的接口。但是,是的......他們至少應該使用System命名空間中的IServiceProvider

DI系統的目標不是它應該提供 爲客戶提供服務依賴關係的不可知論方式?

沒有。這不是這方面的目標。框架作者的主要目標是讓你擴展甚至取代內部服務框架正在使用的。

在你的代碼中,你應該在這些'標準'接口上引入你自己的外觀。他們是非常薄弱的​​抽象 - 對基礎很好,但離任何更豐富的解決方案或終生管理策略都很遙遠。

如果我想在項目中使用IDependencyResolver,該項目不應該 引用與System.Web相關的任何內容?

你不能(不添加System.Web參考),你不應該。在DI框架上使用自己的內部抽象(Facade)。就像你不應該直接在你的類中使用NLog.ILogger一樣,DI框架抽象也是如此。

一些框架將使它接近或不可能做到,但是您應該儘可能使用自己的Facades。

同樣的規則也適用於更廣泛的意義。 請勿將您的項目(不必要地)附加到某些雲服務,如Azure。其他方面可能有更好的價格有一天。儘可能限制依賴關係和粘性部分。

編輯: 這不僅僅是一個有關如何執行請求的哲學問題, 因爲我知道還有其他的替代品,如開源DI庫。

噢...同樣的建議去與DI框架。不要過度使用DI框架功能,這些功能可以通過您的Facades以不同的方式輕鬆實現。

注意:CI管道,服務總線/消息隊列框架也是如此。

相關問題