Essentialy,他的意思是說你的UI代碼直接依賴於數據訪問庫中的代碼。如何這樣的例子可能會在UI層使用:
public class SomeController : Controller
{
[Route("someRoute")]
[HttpGet]
public ViewResult SomeRoute()
{
// Here we're using the data component directly
var dataComponent = new DataAccessLayer.DataComponent();
return View(dataComponent.GetSomeData());
}
}
如果我們想換出數據訪問庫這意味着我們將不得不進入我們的所有控制器和修改代碼以使用新組件(除非我們在相同的命名空間中創建完全相同的類名,但這不太可能)。
在另一方面,我們也可以這樣寫控制器是這樣的:
public class SomeController : Controller
{
IDataComponent _dataComponent;
public SomeController(IDataComponent dataComponent)
{
_dataComponent = dataComponent;
}
[Route("someRoute")]
[HttpGet]
public ViewResult SomeRoute()
{
// Now we're using the interface that was injected
return View(_dataComponent.GetSomeData());
}
}
通過定義這樣的類,我們可以從外部指定哪些具體的類,它實現了IDataComponent
接口應注入構造。這使我們能夠在外部「連線」我們的應用程序。我們正在向一個班級注入具體的課程。
依賴注入是一種使「針對接口而不是具體類進行編程」更容易的方法。
Mark Seemann給出的例子涉及到數據庫和Azure表存儲,但這只是一個例子。這與NoSql(或通常的存儲機制)無關。同樣的原則適用於所有依賴於其他類(通常是服務類的類)的東西。
編輯之後的評論: 確實,你可以修改DataComponent的內部(或存儲庫,如果這就是你使用的)。 但是,使用DI(和編程針對一般的接口),爲您提供了更多的選擇:
- 你可以在同一時間有不同的實現方式,並注入不同的實現取決於哪個控制器,它是(例如)
- 通過指定註冊中的生命週期(可能在此情況下不可用),您可以在所有控制器中重複使用同一個實例
- 出於測試目的,您可以向控制器注入不同的實現(例如模擬,你可以測試調用)
但即使存在某種類型的Repository模式,我認爲如果它的行爲與之前的類型相同,則可以將該庫與另一個交換 - 我們只需要更改Repository內部。 –
增加了一些解釋給我的答案。 – Kenneth