2016-08-24 16 views
0

Mark Seemann在書中的「依賴注入.Net」一書中,第二章分析了一些寫得不好的3層asp.net應用程序。主要觀點是:應用程序失敗,因爲最低層數據訪問無法從SQL與實體框架轉換爲無SQL數據庫的Azure。下面是詳細的報價單:Seemann的DI Azure Table數據訪問

爲了使電子商務應用的雲應用程序,數據訪問庫 必須與使用表存儲服務模塊進行更換。這可能嗎? 從圖2.10中的依賴關係圖中,我們已經知道用戶界面和域庫都依賴於基於實體框架的數據訪問庫。 如果我們試圖刪除數據訪問庫,該解決方案將不再編譯, 因爲缺少必需的DEPENDENCY。 在一個包含數十個模塊的大型應用程序中,我們也可以嘗試刪除那些無法編譯的 模塊以查看剩下的內容。在Mary的申請中,很明顯我們必須刪除所有模塊,而沒有留下任何東西。

雖然有可能開發一個Azure Table中數據訪問 庫是模擬原始數據訪問 庫顯示的API,有沒有辦法,我們可以把它注射到應用程序中。

圖2.10:

enter image description here

我的問題是 - 這是爲什麼模仿以前的行爲模塊不能被注入到應用程序,以及這究竟意味着什麼?它與Azure細節有關嗎?我以前沒有在no-sql數據庫上工作太多。

回答

1

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(和編程針對一般的接口),爲您提供了更多的選擇:

  • 你可以在同一時間有不同的實現方式,並注入不同的實現取決於哪個控制器,它是(例如)
  • 通過指定註冊中的生命週期(可能在此情況下不可用),您可以在所有控制器中重複使用同一個實例
  • 出於測試目的,您可以向控制器注入不同的實現(例如模擬,你可以測試調用)
+0

但即使存在某種類型的Repository模式,我認爲如果它的行爲與之前的類型相同,則可以將該庫與另一個交換 - 我們只需要更改Repository內部。 –

+0

增加了一些解釋給我的答案。 – Kenneth