1. 程式人生 > >ABP原始碼分析七:Setting 以及 Mail

ABP原始碼分析七:Setting 以及 Mail

本文主要說明Setting的實現以及Mail這個功能模組如何使用Setting.

首先區分一下ABP中的Setting和Configuration。

Setting一般用於需要通過外部配置檔案(或資料庫)設定的簡單型別資料(一般就是字串),比如SMTP HOST.

Configuration一般只需要通過內部程式碼完成的配置,一般用於設定複雜型別的資料。

目前Abp在setting 這個功能模組只能從配置檔案讀取設定,無法從其他source(比如資料庫)讀取設定。也可以自定義SettingStore然後注入到ABP中來實現從其他Source讀取設定(非本文重點)。

Setting如何實現的:

首先我們要定義一個Setting,也就是說我們需要設定什麼? 這個就是SettingDefinition。, 

SettingDefinition/SettingDefinitionGroup 用於定義Setting。不同的Name標識不同的Setting。假如要配置SMTP HOST,那麼就可以定義一個name="Abp.Net.Mail.Smtp.Host" 的SettingDefinition。注意: NameDefaultValue必須要的屬性,其他都是輔助屬性。SettingDefinitionGroup用於給SettingDefinition分組,Abp底層框架似乎沒有真正使用過這個類。

下面這個圖說明SettingDefinition/SettingDefinitionGroup定義了哪些屬性及他們的關係。

SettingScopes:這是一個標註了Flags特性的列舉型別,表示setting的應用範圍。

SettingDefinitionProviderContext:上下文類,一般用於封裝方法間呼叫需要傳遞的引數。目前來說只是個空類,沒有實際作用。

SettingProvider: 為具體的功能模組所需的設定定義SettingDefinition,並且以陣列的形式返回。使用SettingProvider定義SettingDefinition的是準確方式。 那麼Setting定義好以後,如何為其設定實際需要的value呢?目前可以在從web.config中設定。目前有EmailSettingProvider用於提供SMTP的設定,NotificationSettingProvider,LocalizationSettingProvider,還有ClearCacheSettingProvider。

SettingsConfiguration /ISettingsConfiguration:用於集中化設定和管理SettingProvider的物件。其封裝了一個ITypeList<SettingProvider> Providers的集合類。實際專案中可以通過Configuration.Setting來獲取ISettingsConfiguration例項,然後將自定義的SettingProvider新增到SettingsConfiguration 物件中(需要在模組的PreInitialize方法完成這個動作)。

ISettingDefinitionManager/SettingDefinitionManager: 主要完成註冊到ABP中的SettingDefinition初始化。 首先通過ISettingsConfiguration例項獲取setting providers集合,然後在Initialize方法中通過setting providers獲取SettingDefinition的陣列。並將其儲存在Dictionary中,其key就是SettingDefinition的name.

ISettingDefinitionManager的Initialize方法是在AbpKernelModule的PostInitialize方法執行的時候被呼叫。

上面介面/類直接的關係圖

上面解釋了ABP是如何定義/管理一個Setting. 下面解釋下ABP是如何使用Setting的。

ISettingValue/SettingValueObject:代表setting的鍵值對。Setting的具體值當然在外部Config中,然而在程式碼中是通過ISettingValue來封裝的。

SettingManager:通過ISettingStore獲取或更改Setting的值,SettingManager並不是每次呼叫ISettingStore去讀取設定,而是在第一讀取的時候就將結果快取起來。如下程式碼所示

定義快取物件

讀入快取

SettingInfo:封裝了應用於user/tenant的setting值


ISettingStore:這個介面定義了相關方法用於從資料來源讀取和更改setting值。 這些方法以SettingInfo型別作為方法的輸入和輸出引數。

DefaultConfigSettingStoreABP中唯一實現了ISettingStore的類,只用於從配置檔案讀取setting,修改是不支援的。ABP.Zero中有另外一個支援CRUD的實現。

下圖是上面介面及類的關係圖

下面以Mail功能的實現來說明如何使用Setting

EmailSettingNames/Smtp: 封裝SMTP設定的資訊。也就是說定義了一些常量用作setting的name. 比如Host就是“Abp.Net.Mail.Smtp.Host”,所以在web.config就要配置一項key是“Abp.Net.Mail.Smtp.Host”的配置項。

EmailSettingProvider:繼承自SettingProvider, 將SMTP的各項設定封裝成SettingDefinition,並以陣列形式返回

ISmtpEmailSenderConfiguration/IEmailSenderConfiguration:定義了獲取EmailSettingNames中定義的設定的介面。

EmailSenderConfiguration/SmtpEmailSenderConfiguration: 實現上面兩個介面,通過IsettingManager的例項讀取設定

IEmailSender/ISmtpEmailSender/EmailSenderBase/SmtpEmailSender: 用於傳送郵件。

最後,照舊圖示他們之間的關係。

相關推薦

ABP原始碼分析Setting 以及 Mail

本文主要說明Setting的實現以及Mail這個功能模組如何使用Setting. 首先區分一下ABP中的Setting和Configuration。 Setting一般用於需要通過外部配置檔案(或資料庫)設定的簡單型別資料(一般就是字串),比如SMTP HOST. Configuration一般

Spring Core Container 原始碼分析註冊 Bean Definitions

前言 原本以為,Spring 通過解析 bean 的配置,生成並註冊 bean defintions 的過程不太複雜,比較簡單,不用單獨開闢一篇博文來講述;但是當在分析前面兩個章節有關 @Autowired、@Component、@Service 註解的注入機制的時候,發現,如果沒有對有關 bea

ABP原始碼分析ABP Module

Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocMa

ABP原始碼分析整體專案結構及目錄

ABP是一套非常優秀的web應用程式架構,適合用來搭建集中式架構的web應用程式。 整個Abp的Infrastructure是以Abp這個package為核心模組(core)+15個模組(module).其中13個依賴於Abp這個核心包。另外兩個包(FluentMigration,Web.Resources

ABP原始碼分析ABP初始化全過程

ABP在初始化階段做了哪些操作,前面的四篇文章大致描述了一下。 為個更清楚的描述其脈絡,做了張流程圖以輔助說明。其中每一步都涉及很多細節,難以在一張圖中全部表現出來。每一步的細節(會涉及到較多介面,類,呼叫關係,步驟流程什麼的)會在後面的文章中通過其他圖和文字詳細描述。其實如果仔細分析Abp原始碼的話,會發現

ABP原始碼分析十三快取Cache實現

ABP中有兩種cache的實現方式:MemroyCache 和 RedisCache. 如下圖,兩者都繼承至ICache介面(準確說是CacheBase抽象類)。ABP核心模組封裝了MemroyCache 來實現ABP中的預設快取功能。 Abp.RedisCache這個模組封裝RedisCache來實現快取(

ABP原始碼分析Logger整合

ABP使用Castle日誌記錄工具,並且可以使用不同的日誌類庫,比如:Log4Net, NLog, Serilog... 等等。對於所有的日誌類庫,Castle提供了一個通用的介面來實現,我們可以很方便的處理各種特殊的日誌庫,而且當業務需要的時候,很容易替換日誌元件。 Logger功能模組涉及到的介面和類不

ABP原始碼分析Configuration

核心模組的配置 Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。 ABP中核心功能模組中的一些功能的執行時的

ABP原始碼分析ABP中配置的註冊和初始化

一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http

ABP原始碼分析依賴注入的實現

ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的例項定義注入的約定(規則),然後通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManag

ABP原始碼分析Unit Of Work

ABP以AOP的方式實現UnitOfWork功能。通過UnitOfWorkRegistrar將UnitOfWorkInterceptor在某個類被註冊到IOCContainner的時候,一併新增到該類在容器中對應的ComponentModel的Interceptors集合中。總結一句話就是,UOW的功能是通過

ABP原始碼分析後臺工作任務

文主要說明ABP中後臺工作者模組(BackgroundWorker)的實現方式,和後臺工作模組(BackgroundJob)。ABP通過BackgroundWorkerManager來管理BackgroundJobManager,然後通過BackgroundJobManager來管理BackgroundJob

ABP原始碼分析二十ABP.Entity Framework

IRepository:介面定義了Repository常見的方法 AbpRepositoryBase:實現了IRepository介面的常見方法 EfRepositoryBase:實現了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實

ABP原始碼分析四十一ZERO的Audit,Setting,Background Job

AuditLog: 繼承自Entity<long>的實體類。封裝AuditLog的資訊。 AuditingStore: 實現了IAuditingStore介面,實現了將AuditLog的資訊儲存到資料庫的功能。其通過IRepository<AuditLog, long>例項完成對資料

ABP原始碼分析DTO 自動校驗的實現

對傳給Application service物件中的方法的DTO引數,ABP都會在方法真正執行前自動完成validation(根據標註到DTO物件中的validate規則)。 ABP是如何做到的? 思路無外乎通過Castle的攔截器實現AOP。本文主要分析ABP是如何設計。 Ivalidate: 空介面,用

ABP原始碼分析三十ABP.Web.Api Script Proxy API

ABP提供Script Proxy WebApi為所有的Dynamic WebApi生成訪問這些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。這些個代理就是javascript指令碼,通過這些代理可以簡單的訪問Dynamic webApi。 如下例項演示一個最基本的

ABP原始碼分析四十ABP中的異常處理

ABP 中異常處理的思路是很清晰的。一共五種型別的異常類。 AbpInitializationException用於封裝ABP初始化過程中出現的異常,只要丟擲AbpInitializationException異常就可以,無須做額外處理。這類異常往往是需要維護人員介入分析的。 其他四個異常都在AbpCon

[Abp 原始碼分析]十、ASP.NET Core 整合

0. 簡介 整個 Abp 框架最為核心的除了 Abp 庫之外,其次就是 Abp.AspNetCore 庫了。雖然 Abp 本身是可以用於控制檯程式的,不過那樣的話 Abp 就基本沒什麼用,還是需要集合 ASP.NET Core 才能發揮它真正的作用。 在 Abp.AspNetCore 庫裡面,Abp 通過 W

XBMC原始碼分析 1整體結構以及編譯方法

XBMC(全稱是XBOX Media Center)是一個開源的媒體中心軟體。XBMC最初為Xbox而開發,可以執行在Linux、OSX、Windows、Android4.0系統。我自己下載了一個然後體驗了一下,感覺確實不錯,和Windows自帶的媒體中心差不多。 XB

ABP原始碼分析十四Entity的設計

IEntity<TPrimaryKey>: 封裝了PrimaryKey:Id,這是一個泛型型別 IEntity: 封裝了PrimaryKey:Id,這是一個int型別 Entity<TPrimaryKey> :支援主鍵是泛型型別的Entity Entity:支援主鍵是int型別的