從零開始在.NetCore3.1 Web項目中使用IOC


前言

  現在的編程世界中,IOC已經成為了標配,畢竟解耦對於代碼開發和維護都提升了很大的效率;而.NetCore中就自帶了IOC功能,下面記錄一下.NetCore Web項目中IOC的使用及如何集成AutoFac; 

環境

  開發環境: .NetCore3.1;注:需要安裝對應的SDK版本;

項目創建

  1. 選擇模板  -- ASP.NET Core Web應用程序;

 

  2. 添加兩個項目DotNetCoreBll 和 DotNetCoreDal ,選模板的時候選擇  類庫(.Net Core);

  最終項目結構

 

   加這兩個程序集的目的就是為了模擬業務處理,DotNetCoreBll 業務處理;DotNetCoreDal  獲取數據;  設置DotNetCoreIoc 為啟動項目運行,如下圖

 

   出現以上界面項目創建成功;

傳統方式--自己New 

  1. 分別在DotNetCoreBll 和 DotNetCoreDal中增加 類 UserBll  和 UserDal  ,  里面代碼如下:

  類UserDal  :

  

 

   類UserBll:

  

 

   2. 在HomeController中增加一個Api

  

 

   然后,運行項目,訪問http://localhost:5000/Home/GetUserName 地址,運行如下:

        

 

  綜上, 可以看出,傳統方式也能正常開發功能,但是各個程序集之間耦合性太太強,不符合軟件設計原則,當項目規模變大時,項目也不好維護; 從開發角度來說,需要開發人員手動創建對象,開發效率不高;

.NetCore 自帶IOC

  三大步走起:

    1.  在Web項目中找Startup.cs 文件, 打開文件,在方法ConfigureServices中將對應類型注入到容器中,如下:

  

 

     2. 在調用控制器構造函數中進行注入, 這里是在HomeController中,如下:

  

 

     3. 在對應API中使用

  

 

     運行訪問

       

 

   如上,正常訪問,但是雖然減少了開發者手動new對象的過程,但是耦合性的問題還是存在的呀,所以這里引入依賴倒置原則,即依賴於抽象,不依賴於具體,所以我們通常會引入對應的抽象層,通常是接口的形式;

  抽象化,增加接口層,並添加對應的接口,項目結構如下:

  

 

    IUserBll 和  IUserDal 代碼代碼分別如下:

  

 

  將原來的UserBll和UserDal分別繼承IUserBll和IUserDal,如下:

  

   IOC根據以上三步使用,修改對應的代碼

  1.  在注入容器中進行優化:

  

 

   2. 構造函數注入,改為接口:

  

 

   3. 使用的地方不變

 

  運行如圖,正常運行:

  

 

    通過這樣優化,耦合性降低了,依賴於抽象,平時也都是這么用;

  缺點: 由於.NetCore自帶的IOC,在注冊到容器的時候,只能指定對應的類型,當項目類型比較多的時候,在注冊時就會大量的寫代碼;

  措施: 通常我們會引入第三組件進行解決,因為第三方組件提供了注冊程序集的功能,這里主要記錄一下AutoFac在.NetCore項目中的使用;

.NetCore3.1 集成AutoFac

  1. 在Web項目中通過Nuget引入AutoFac包;

  

  2. 首先在 Startup.cs 中添加 ConfigureContainer 方法,  方法名不變;

  

 

   3. 修改 Program.cs 將默認ServiceProviderFactory指定為AutofacServiceProviderFactory

  

 

   

  弄完以上步驟,注釋掉原來的注入

       

 

   運行項目,看結果正常:

  

 

總結

  綜上所述,.NetCore項目中Ioc及集成Autofac的使用看着比較簡單,但以上例子只修改了業務層, Dal層沒有優化,你們可以參考業務層,可以練習一下Dal層的優化; 另外Autofac的知識點還不少,如果不知道的,自行百度學學,有問題隨時溝通;

關注公眾號,每周最少兩篇關於.NetCore相關文章

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM