最基礎的:UI-BLL-DAL 這是我們耳熟能詳的分層 (補充:) 我們的類正常都不是孤立存在的。很多都是要依賴於其它的類。 比如說我們有一個Work類,Work類在工作的時候需要把信息記錄下來。 MessageWriter就是 Worker的依賴項 首先我聽到依賴註入之後看似非常的複雜 實際則是: ...
最基礎的:UI-BLL-DAL
這是我們耳熟能詳的分層
(補充:) 我們的類正常都不是孤立存在的。很多都是要依賴於其它的類。 比如說我們有一個Work類,Work類在工作的時候需要把信息記錄下來。 MessageWriter就是 Worker的依賴項
首先我聽到依賴註入之後看似非常的複雜
實際則是:為了實現不同的團隊在不同的層上工作。我們可以讓一個團隊處理數據訪問層,一個團隊處理業務層,一個團隊處理UI。
首先建立:最基本的三層架構
實體層:
public class Product { public Guid Id { get; set; } public string Name { get; set; } public string Description { get; set; } }
數據層:DAL
public class ProductDAL { private readonly List<Product> _products; public ProductDAL() { _products = new List<Product> { new Product { Id = Guid.NewGuid(), Name= "iPhone 9", Description = "iPhone 9 mobile phone" }, new Product { Id = Guid.NewGuid(), Name= "iPhone X", Description = "iPhone X mobile phone" } }; } public IEnumerable<Product> GetProducts() { return _products; } public IEnumerable<Product> GetProducts(string name) { return _products .Where(p => p.Name.Contains(name)) .ToList(); } }l
邏輯層:BLL
public class ProductBL { private readonly ProductDAL _productDAL; public ProductBL() { _productDAL = new ProductDAL(); } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }
UI層:UI
class Program { static void Main(string[] args) { ProductBL productBL = new ProductBL(); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); } }
以上就是我們基礎的結構: UI - BLL - DAL 引用順序
那麼出現以下三個問題:
1.我們不能讓三個不同的團隊在每個層上工作。
2.業務層很難擴展,因為它依賴於數據訪問層的實現。
3.業務層很難維護,因為它依賴於數據訪問層的實現。
高級別對象不應該依賴於低級別對象。兩者都必須依賴於抽象。那麼抽象概念是什麼呢?
抽象是功能的定義。在我們的例子中,業務層依賴於數據訪問層來檢索圖書。在C#中,我們使用介面實現抽象。介面表示功能的抽象。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以下為修改後結構
數據層:DAL
DAL:介面
public interface IProductDAL { IEnumerable<Product> GetProducts(); IEnumerable<Product> GetProducts(string name); }
DAL:實現
public class ProductDAL : IProductDAL
業務邏輯層:BLL 這樣我們就做到了 使其依賴於IDAL 抽象層,而不是DAL層直接實現:
public class ProductBL { private readonly IProductDAL _productDAL; public ProductBL() { _productDAL = new ProductDAL(); } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }
業務邏輯層:IBLL (同樣的 UI 依賴於BLL 我們也這樣做 搞個抽象層 介面)
public interface IProductBL { IEnumerable<Product> GetProducts(); IEnumerable<Product> GetProducts(string name); }
同理:更新BLL層:
public class ProductBL : IProductBL
UI層: 就和BLL依賴於DAL一樣 UI依賴於BLL
class Program { static void Main(string[] args) { IProductBL productBL = new ProductBL(); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以上為抽象層的建立,
還記得我們標紅的地方嗎?
public ProductBL() { _productDAL = new ProductDAL(); }
BLL依賴於IDAL ,但是 最終我們還是依賴於DAL
到目前為止,我們所做的工作都與依賴註入無關
為了使處在BLL依賴於DAL的功能,而沒有具體的實現,必須由其他人創建類。其他人必須提供底層對象的具體實現,這就是我們所說的依賴註入。它的字面意思是我們將依賴對象註入到更高級別的對象中。
實現依賴項註入的方法之一是使用構造函數進行依賴項註入。
更新業務層:
public class ProductBL : IProductBL { private readonly IProductDAL _productDAL; public ProductBL(IProductDAL productDAL) { _productDAL = productDAL; } public IEnumerable<Product> GetProducts() { return _productDAL.GetProducts(); } public IEnumerable<Product> GetProducts(string name) { return _productDAL.GetProducts(name); } }
UI:
class Program { static void Main(string[] args) { IProductBL productBL = new ProductBL(new ProductDAL()); var products = productBL.GetProducts(); foreach (var product in products) { Console.WriteLine(product.Name); } Console.ReadKey(); } }
創建DAL控制與UI結合在一起。這也稱為控制反轉
我們不是在BLL中創建DAL的實例,而是在UI的中創建它。 Main方法將把實例註入到業務邏輯層。因此,我們將低層對象的實例註入到高層對象的實例中。
這叫做依賴註入
現在,如果我們看一下代碼,我們只依賴於業務訪問層(BLL)中數據訪問層(IDAL)的抽象,而業務訪問層(BLL)是使用的是數據訪問層實現的介面。因此,我們遵循了更高層次對象和更低層次對象都依賴於抽象的原則,抽象是更高層次對象和更低層次對象之間的契約。
接下來就顯示了可維護性和可擴展性的好處。例如,如果我們想為SQL Server創建一個新的數據訪問層,我們只需實現數據訪問層的抽象並將實例註入基礎設施中。
原文連接: www.cnblogs.com/hhhnicvscs/p/14204806.html
原文鏈接:www.codeproject.com/Articles/5274732/Dependency-Injection-and-IoC-Containers-in-Csharp