ABP的依賴註入基於Castle Windsor,可以通過Nuget搜索Castle.Windsor來安裝使用 ABP框架運行其實是以模塊進行載入的運行的,通過源碼得知AbpModule是所有模塊基類(也就是說一個程式集就是一個模塊,我們在創建類庫時,可以在創建一個模塊類的時候繼承AbpModule ...
ABP的依賴註入基於Castle Windsor,可以通過Nuget搜索Castle.Windsor來安裝使用
ABP框架運行其實是以模塊進行載入的運行的,通過源碼得知AbpModule是所有模塊基類(也就是說一個程式集就是一個模塊,我們在創建類庫時,可以在創建一個模塊類的時候繼承AbpModule),本質上是一個抽象類,有三個虛方法,分別為:PreInitialize、Initialize、PostInitialize.
子類在繼承的時候,必須重寫它,在PreInitialize方法里就可以通過Castle Windsor依賴註入介面對象:
圖中,可以看到,通過IcoManager.AddConventionalRegister方法按照約定註冊了mvc的控制器,這些都是ABP在啟動的時候,自行註入。
ABP中的依賴註入
1、註冊(Registering)
在ABP中,有很多種方式來註冊你的類到到系統里,通常常規方法就可以滿足我們大部分日常場景。
2、常規註冊(conventional registration)
在ABP中大量運用到【常規註冊】,按照約定ABP在啟動的時候會自動註入IRepository、IDomainService、IApplicationService、ILogger、MVC控制器、webapi控制器。
比如:mvc控制器。
從圖中可以看到,通過IcoManager.AddConventionalRegister方法,傳入了ControllerConventionalRegistrar實例,F12進入其中,可看到
當然比較有意思的是下圖中的紅線框框處的代碼:
解釋下:這是以WindsorControllerFactory取代了asp.net mvc預設的控制器工廠,並且註入我們的IOC容器實例,這樣我們即可在控制器的構造函數中通過依賴註入,獲取介面對象實例。
那問題來了,這些常規註冊的對象,是如何在應用在啟動的時候就註入到了ioc容器了呢?答案看下圖:
AbpWebApplication類相當與Global.asax文件(asp.net的開發不陌生吧)
我們再細看AbpBootstrapper的Initialize方法:
ABP的依賴註入幾個核心介面
IApplicationService
比如,你可能有一個IPersonAppService介面和一個實現了該介面的PersonAppService類:
public interface IPersonAppService : IApplicationService
{
//...
}
public class PersonAppService : IPersonAppService
{
//...
}
因為它實現了IApplicationService介面(只是一個空介面),所以ABP會自動註冊它,並註冊為transient(每次使用創建一個實例)。當你使用構造函數註入IPersonAppService介面到一個類中時,一個PersonAppService對象會自動地創建並傳入該類的構造函數中。
命名規範在ABP中非常重要。比如,你可以將PersonAppService更名為MyPersonAppService或是其他包含了“PersonAppService”尾碼的名字,因為IPersonAppService介面有這個尾碼。但你不能將它命名為PeopleService。如果你沒有按照這種命名規範來操作的話,那麼IPersonAppService不會自動地註冊(但是它已經以自註冊的方式註入到DI框架,而不是介面方式),因此如果你想要以介面方式註冊的話,那麼你應該手動註冊。
IDomainService
ABP定義了IDomainService介面,所有的領域服務都按照慣例實現了該介面。當實現時,領域服務會以transient自動註冊到依賴註入系統。
此外,領域服務(可選地)可以從DomainService類繼承。因此,它可以使用一些繼承的屬性,比如logging,本地化等等。當然,如果沒有繼承,如果需要的話也可以註入這些屬性。
