Orchard Core使用IShellConfiguration擴充套件了ASP.NET Core IConfiguration,以允許在應用程式範圍的配置之上進行特定於租戶的配置。雖然本文件使用OrchardCore.Cms.Web.csproj示例中Web應用程式的配置,但如果您在自己的Web應用程式中使用NuGet包中的Orchard,那麼在專案中也可以使用Orchard。

配置資源

Orchard Core支援配置源層次結構。

1、ASP.NET Core專案的啟動項,例如OrchardCore.Cms.Web.csproj、appsettings.json或根據環境appsettings.Development.json。
2、全域性租戶配置App_data/appsettings.json,或根據環境App_data/appsettings.Development.json。
3、位於App_Data/Sites/{Tenant_Name}/appsettings.json資料夾中每個租戶資料夾下的各個租戶配置檔案。注意:這些是可變檔案,不支援環境版本。
4、環境變數,或通過Azure將AppSettings作為環境變數。
配置源按上述順序載入,層次結構中較低的設定將覆蓋較高配置的值,例如:全域性租戶值將始終被環境變數覆蓋。

下面appsettings.json示例中的IShellConfiguration模式僅適用於專門支援此類配置的模組。您可以檢視給定模組的程式碼或文件,看看情況是否如此。
OrchardCore.Cms.Web.csproj啟動專案中的IShellConfiguration。
Orchard Core將所有配置資料儲存在appsettings.json檔案中的OrchardCore部分下:

{
"OrchardCore": {
... module configurations ...
}
}

每個Orchard Core模組在OrchardCore部分下都有自己的配置部分:

{
"OrchardCore": {
"OrchardCore.Media": {
... individual module configuration ...
}
}
}

有關更多示例,請參見appsettings.json檔案。

租戶的預配置說明

要在建立租戶之前預先配置租戶的設定值,可以指定一個以租戶命名的部分,其State值為Uninitialized

{
"OrchardCore": {
"MyTenant": {
"State": "Uninitialized",
"RequestUrlPrefix": "mytenant",
"ConnectionString": "...",
"DatabaseProvider": "SqlConnection"
}
}
}

然後,預配置的租戶將出現在管理員的租戶列表中,這些值將在設定租戶時使用。

租戶建立後配置說明

要在建立租戶後配置租戶的值,您可以指定一個以租戶命名的部分,而不必提供狀態值。

{
"OrchardCore": {
"Default": {
"OrchardCore_Media": {
... specific tenant configuration ...
}
}
}
}

全域性租戶資料訪問配置

如果您希望所有租戶都訪問同一資料庫,該怎麼辦?對應的配置可以儲存在一個地方,而不是逐個為所有租戶設定相同的連線字串,如下所示:

{
"OrchardCore": {
"ConnectionString": "...",
"DatabaseProvider": "SqlConnection",
"Default" : {
"State": "Uninitialized",
"TablePrefix": "Default"
}
}
}

請注意,儘管您可以對租戶使用相同的配置鍵(如前所述),但這是在OrchardCore部分的根目錄中。
為所有租戶使用的資料庫新增連線字串。
DatabaseProvider應與使用的資料庫引擎相對應,示例為SQL Server。
需要將TablePrefix配置為預設租戶使用的字首,以便可以為每個租戶分隔表(否則,只有預設租戶的表會缺少字首)。然後,應為其他租戶設定不同的字首。
這樣,通過在給定環境中配置相應資料庫的設定,應用程式可以在不同環境之間輕鬆移動(如臨時環境和生產環境)。租戶的外殼設定不會包含此資訊,所有租戶將使用相同的全域性配置。
相關主題是Shell配置提供程式。有關如何將所有外殼配置保留在資料庫中的資訊,請特別參閱關於資料庫外殼配置提供程式的部分。

IOptions配置

您還可以從Web專案的Startup類中的程式碼配置IOptions。
許多Orchard Core功能都是通過管理UI配置的,站點設定儲存在資料庫中,和/或通過IOptions公開配置。如果您希望覆蓋站點設定或預設設定,可以使用您自己的配置程式碼執行此操作。
例如,電子郵件模組允許通過SmtpSettings類進行SMTP配置,預設情況下,SmtpSettings類由給定租戶的站點設定(在管理員上設定)填充。但是,您可以像這樣覆蓋Startup類中的站點設定(請注意,我們使用PostConfigure來覆蓋站點設定值,但是如果模組不使用站點設定,您可以只使用Configure):

services
.AddOrchardCms()
.ConfigureServices(tenantServices =>
tenantServices.PostConfigure<SmtpSettings>(settings =>
{
settings.Port = 255;
})); // Or if you want to make use of IShellConfiguration as seen above:
services
.AddOrchardCms()
.ConfigureServices((tenantServices, serviceProvider) =>
{
// Instead of IShellConfiguration you could fetch the configuration
// values from an injected IConfiguration instance here too. While that
// would also allow you to access standard ASP.NET Core configuration
// keys it won't have support for all the hierarchical sources
// detailed above.
var shellConfiguration = serviceProvider.GetRequiredService<IShellConfiguration>();
var password = shellConfiguration.GetValue<string>("SmtpSettings:Password"); tenantServices.PostConfigure<SmtpSettings>(settings =>
{
settings.Password = password;
});
});

這將使SMTP埠使用此配置,而不考慮站點設定中定義的任何其他值。第二個示例的配置值可以來自例如appsettings.json檔案,如下所示:

{
"OrchardCore": {
"SmtpSettings": {
"Password": "password"
}
}
}

在管理頁面不會有此覆蓋發生的提示,並且那裡顯示的值仍將是站點設定中配置的值,所以如果您選擇這樣做,您需要讓您的使用者知道。

ORCHARD_APP_DATA 環境變數

可以通過設定ORCHARD_APP_DATA環境變數來配置App_Data資料夾的位置。路徑可以是相對於應用程式路徑(./App_data)、絕對路徑(/path/from/root)或完全限定路徑(D:\path\to\App_data)。如果該資料夾不存在,應用程式將嘗試建立它。

IShellConfiguration 配置在全域性租戶配置在App_data/appsettings.json中

這些設定也可以位於App_Data/appsettings.json資料夾(預設情況下不建立)中,其中指定的任何設定都將覆蓋啟動專案中的設定。

IShellConfiguration配置在單獨的租戶資料夾中

這些設定是可變的,並且在為租戶設定期間寫入。因此,不支援讀取環境名稱。此外,這些appsettings.json檔案不需要OrchardCore節。

{
"OrchardCore_Media": {
... specific tenant configuration ...
}
}

IShellConfiguration通過環境變數配置

OrchardCore__OrchardCore_Media__MaxFileSize

OrchardCore__Default__OrchardCore_Media__MaxFileSize

OrchardCore__MyTenant__OrchardCore_Media__MaxFileSize

為了支援Linux,下劃線_用作分隔符,例如OrchardCore_Media。 OrchardCore.Media也支援向後相容,建議使用者使用_的方式。

層級順序

預設情況下,Orchard核心站點將在啟動專案的Program.cs中使用CreateDefaultBuilder,它將按以下順序載入IConfiguration。

1、啟動專案appsettings.json。
2、啟動專案appsettings.{Environment}.json。
3、使用者機密(如果環境為開發)。
4、環境變數。
5、命令列引數。
6、然後,IShellConfiguration將為特定租戶新增這些1.app_data/appsettings.json 2.app_data/site/{Tenant_Name}/appsettings.json。

注意:後面載入的如果具有相同Key的配置優先於較早載入的配置,以後面的為準。