前面幾篇文章只是初步搭建項目結構,那到底能否運行呢?(能是肯定的啦)
畢竟咱都NetCore了,所以依賴注入要搞起來。專業的解釋我就不多說了,很多博客文章說的很詳細(其實是我忘了那些術語怎么講)。
按照我的理解來說的話就是:
省的你自己手動new了,假如你要更改接口,那不就要每個new的地方都改一下?
松耦合,可重用,易維護。簡單舉例來說:我通過構造函數注入的是接口類,不直接依賴實現,所以你可以很方便的去更換實現,這不就松耦合了嗎?可重用這個看個人需求吧,因為解耦彼此都是模塊化的,獨立的,所以可重用,維護也較為簡單,對整個項目影響較小。
倉儲模式本身的目的就是為了解耦合,模塊化。
回想一下項目之間的彼此依賴關系:
1 倉儲接口層定義接口類,倉儲實現層引用倉儲接口層實現具體內容。主要用于和數據庫打交道。
2.1 服務接口層引用倉儲接口層,主要用于調用倉儲層對數據庫進行交互。
2.2 服務接口層定義接口類,服務實現層引用服務接口層實現具體實現。主要處理業務邏輯。
3.1 API程序層引用服務接口層,接收前端的請求,主要調用服務層進行業務邏輯處理。
基本上就是這么一個流程。他們彼此之間是有直接或間接的依賴關系的。這些可能無法完全解耦……但實現層并未進行直接依賴,所以耦合性體現在這里~
回到文章一開始所說的:Autofac依賴注入!因為實現層還沒有實際的包含進項目,所以我的做法是通過DLL程序集反射進行整個實現層的注入。還可以多個實現層注入,但是這點我沒操作過,所以暫時就不說了,只是告訴你們這個可以做到~
這里我新建了一個類庫:FastEasy.Common (公共類庫)

主要就是添加一些多個地方會用到的東西,但是即便你不用也不影響的一些東西,比如這個autofac,微軟也有自帶的依賴注入可以選擇,再比如日志,這個可選擇的更多了,Nlog,Log4,serilog等等。我將這些搞到公共類庫中,可以根據自己選擇來使用,個人覺得比較方便一些~
本身我之前寫過Autofac的教程,所以可能接下來會復制一些之前的……
- 引入Autofac包:Autofac.Extensions.DependencyInjection 包含了Autofac。
![]()
- 在Common公共類庫添加Autofac相關的類,例如上面的截圖,一眼就看出來這個是autofac相關的東西~
- 打開新建的AutofaModule類,繼承Autofac的Module,敲override,重新antofac的Load加載方法~我直接貼代碼了,代碼有注釋~~~
protected override void Load(ContainerBuilder builder) { //程序集目錄 var basePath = AppDomain.CurrentDomain.BaseDirectory; //倉儲層服務層程序集路徑 var repositoryPath = Path.Combine(basePath, "FastEasy.Repository.dll"); var servicePath = Path.Combine(basePath, "FastEasy.Service.dll"); //加載程序集 var repository = Assembly.LoadFrom(repositoryPath); var service = Assembly.LoadFrom(servicePath); //注入程序集 builder.RegisterAssemblyTypes(repository, service) .AsImplementedInterfaces(); }
- 修改程序默認的容器工廠。用Autofac覆蓋它!Programs中配置
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());//覆蓋默認的容器工廠。 builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterModule(new AutofacModule()); });
- 最后一步可做可不做的操作:前面說過了,實現層沒有直接引用,所以生成解決方案的時候是不包含倉儲實現層和服務實現層的。這里有兩個操作。
- 第一個不用寫代碼,就是生成的時候把這兩個dll丟到api下的bin文件夾里。
- 第二張需要稍微配置一下實現層的 =》屬性>生成>輸出>輸出的基路徑: ..\FastEasyAPI\bin\
![]()
到這里就結束了,需要注意的點就是,如果修改了實現層,需要單獨生成一下實現層,將其生成到發布路徑下。
測試效果:我添加了一個測試用的Test控制器,包括其相應的倉儲類服務類,并新增加減乘除接口。代碼就不粘貼了,都是基礎……就看一下接口的返回效果就好,看是否可以調用到倉儲層返回結果

掰掰~


浙公網安備 33010602011771號