NetModular 新年第一更以及升級指南(打造簡單易用的.Net Core模組化快速開發框架~)
先給大家拜個晚年,祝大家身體健康,遠離肺炎~
NetModular開源已有一年,在這一年收到了很多建議,框架也變得越來越完善。這次更新包括了從去年年尾到現在所做的更改,感覺更改的內容還是蠻多的,所以記錄一下並提供一個升級指南供大家參考~
老規矩,先上地址~
原始碼
GitHub:https://github.com/iamoldli/NetModular
碼雲:https://gitee.com/laoli/NetModular
歡迎star~
文件
https://docs.17mkh.com/
演示地址
Demo:https://demo.17mkh.com/
賬戶:admin
密碼:admin
更新日誌 2020-02-10
後端
0、新增快取管理功能,當無法連線快取伺服器時,可在後臺對快取進行清除管理
1、實現 Token 自動重新整理功能,系統設定頁面可設定
RefreshToken
的有效期
2、實現單賬戶登入功能,同一個賬戶只能同時登入一個,該功能可在系統配置頁面進行關閉或啟用
3、從原來的賬戶服務
IAccountService
中剝離出身份認證服務IAuthService
4、修改模組配置管理功能,統一管理所有模組的配置項,移除原來的
module.json
配置檔案
大家應該都遇到過這樣一個場景:專案經理提出一個新的需求,該需求需要做到靈活可配置的,大部分人都會選擇在配置檔案中新增一個配置項來解決此問題,那麼問題來了,這個配置可能會經常修改,每次修改都要連線伺服器修改配置檔案,專案經理必定會找你來該,如果此時你正忙於其它事情,一定會感覺很煩躁~然後你會考慮把配置放到資料庫中,在後臺提供頁面進行修改,那麼問題又來了,為了一兩個配置建立一張表並且還要開發頁面,是不是很麻煩~所以便有了模組配置管理這個功能
只需要按照約定,頂一個配置類,不需要關係儲存和更新,直接在用到的地方注入你定義的配置類就能使用~
5、調整模組發現註冊機制
原來是從模組的Infrastructure
程式集中,讀取_module.json 檔案來發現模組並註冊,現在調整為從應用根目錄的_modules
目錄下發現_module.json 檔案,此次更改是為了以後開發模組熱插拔功能做準備
6、調整模組生成 NuGet 包的機制
現在編譯生成 NuGet 包時候,會自動生成_modules 目錄以及_module.json 檔案,並自動將該檔案打包進Infrastructure
和Web
對應的 NuGet 包中,當在模組中安裝Infrastructure
Web
包時,會自動把_module.json 檔案複製到輸出模組,然後模組就能被發現註冊了
7、新增模組業務服務注入
IModuleServicesConfigurator
介面
原來模組需要注入特有服務的時候,只能通過實現IModuleInitializer
介面的方式,但是這個方式有一個弊端,只能用於 Web 應用,沒有辦法在控制檯應用中使用,所以新增了一個IModuleServicesConfigurator
介面,該介面包含一個Configure
方法,專門用於注入模組業務相關的服務
/// <summary>
/// 配置
/// </summary>
/// <param name="services">服務集合</param>
/// <param name="modules">模組列表</param>
/// <param name="env">環境變數</param>
void Configure(IServiceCollection services, IModuleCollection modules, IHostEnvironment env);
這裡有一個約定,IModuleServicesConfigurator
介面用於注入當前模組業務相關的服務,IModuleInitializer
介面用於注入與 Web 功能有關的服務,比如Admin
模組中
public class ModuleServicesConfigurator : IModuleServicesConfigurator
{
public void Configure(IServiceCollection services, IModuleCollection modules, IHostEnvironment env)
{
//密碼處理服務
services.AddSingleton<IPasswordHandler, Md5PasswordHandler>();
//載入系統配置
var systemConfig = services.BuildServiceProvider().GetService<SystemConfigResolver>().Load().Result;
services.AddSingleton(systemConfig);
//模組配置項儲存處理程式
services.AddSingleton<IModuleOptionsStorageProvider, ModuleOptionsStorageProvider>();
}
}
public class ModuleInitializer : IModuleInitializer
{
public void ConfigureServices(IServiceCollection services, IModuleCollection modules, IHostEnvironment env)
{
//審計日誌服務
services.AddSingleton<IAuditingHandler, AuditingHandler>();
//許可權驗證服務
services.AddScoped<IPermissionValidateHandler, PermissionValidateHandler>();
//單賬戶登入處理服務
services.AddScoped<ISingleAccountLoginHandler, SingleAccountLoginHandler>();
}
...其它程式碼...
}
上面的,密碼處理服務、系統配置載入、模組配置儲存等服務,都屬於業務相關,而審計日期、許可權認證、單賬戶登入等都跟 Web 有關,因為控制檯應用中是不包含這些的
8、調整了
IModuleInitializer
中注入服務方法ConfigureServices
中的引數,添加了IModuleCollection
引數,方便訪問其他模組中的資訊
/// <summary>
/// 注入服務
/// <para>此方法用於注入與Web相關的服務,否則請通過IModuleServicesConfigurator介面註冊</para>
/// </summary>
/// <param name="services"></param>
/// <param name="modules">模組集合</param>
/// <param name="env">環境變數</param>
void ConfigureServices(IServiceCollection services, IModuleCollection modules, IHostEnvironment env);
9、新增自動建立資料庫後初始化資料功能
如果您想在系統自動建立資料庫後,初始化一些資料,可在db.json
檔案中,新增InitData
屬性,設定為 true 即可,他會在系統啟動時並且建立資料庫後初始化資料(前提是對應模組包含了初始化資料)
如果您希望模組建立資料庫後可以初始化資料,只需要要資料庫指令碼放到 WebHost 中的_modules 目錄中,以 Admin 為例
指令碼會自動打包進 NuGet 包中,安裝後會自動輸出到資料路徑~
9、個人精力有限,程式碼不在相容.Net Core2.2 版本,望諒解~
10、程式碼優化~
前端
0、列表頁元件(nm-list)新增
reset
事件以及不顯示重置按鈕的屬性no-reset
1、修復下拉框元件
checked-first
屬性不生效的 bug
2、修復列表頁元件當查詢欄不顯示時,為判斷 querybar 物件是否存在而導致查詢異常的 bug
3、調整身份認證相關的功能,以適配後端所做的調整,如單賬戶登入等功能
4、調整系統配置頁面
模組
0、調整所有模組程式碼,以便支援新的框架中的功能調整,比如配置管理的功能
1、優化了程式碼生成器模組,修復了開啟實體列表時偶發性出現介面錯誤的 bug
2、程式碼生成器模組支援單個實體程式碼生成,生成的檔案中只包含實體有關的,生成後可直接 copy 到專案中
升級指南
由於本次更新較大,需要修改多個地方,包括專案檔案等,所以提供一個指南方便大家操作,如有疑問,可參考 Common 模組~
0、修改 Directory.Build.props 檔案
新增一個Icon
屬性,用於指定模組的展示圖示,目前該圖示只在配置管理中用到~
1、因為模組資訊添加了一個圖示屬性,所以對應的表
ModuleInfo
需要新增一個列Icon
2、修改
module.build.targets
檔案
該檔案用於編譯時自動生成_module.json
檔案,你可直接複製下面程式碼覆蓋
<Project>
<PropertyGroup>
<ModulesDir>_modules\$(Id)</ModulesDir>
<ModuleName>$(ModulesDir)\_module.json</ModuleName>
<ModuleInfo>{"Id": "$(Id)","Name":"$(Name)","Icon":"$(Icon)","Version":"$(Version)"}</ModuleInfo>
</PropertyGroup>
<Target Name="ModulesBuild" AfterTargets="Build">
<!--建立modules目錄-->
<MakeDir Directories="$(ModulesDir)"/>
<!--生成module.json檔案,Note:專案需要生成兩次,否則Nuget包中的檔案不是最新的-->
<WriteLinesToFile File="$(ModuleName)" Overwrite="true" Lines="$(ModuleInfo)" />
</Target>
</Project>
3、修改
Infrastructure
的專案檔案
移除了匯入module.build.targets
檔案的程式碼,添加了將_modules 目錄打包進 NuGet 包的程式碼
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="HtmlAgilityPack" Version="1.11.18" />
<PackageReference Include="NetModular.Lib.Options.Abstraction" Version="1.7.2" />
<PackageReference Include="NetModular.Module.Admin.Domain" Version="1.7.2" />
<PackageReference Include="NPinyin.Core" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Domain\Domain.csproj" />
</ItemGroup>
<!--打包模組相關檔案到NuGet包中,此功能需要編譯兩次專案才行,因為打包操作在建立_module.json檔案之前執行的-->
<ItemGroup>
<Content Include="$(SolutionDir)\src\WebHost\_modules*\**\*.*" PackagePath="contentFiles\any\any">
<Pack>true</Pack>
<PackageCopyToOutput>true</PackageCopyToOutput>
</Content>
</ItemGroup>
</Project>
4、修改
Web
的專案檔案
添加了將_modules 目錄打包進 NuGet 包的程式碼
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NetModular.Lib.Auth.Web" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Module.AspNetCore" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Utils.Mvc" Version="1.7.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Library\Application\Application.csproj" />
</ItemGroup>
<!--打包模組相關檔案到NuGet包中,此功能需要編譯兩次專案才行,因為打包操作在建立_module.json檔案之前執行的-->
<ItemGroup>
<Content Include="$(SolutionDir)\src\WebHost\_modules*\**\*.*" PackagePath="contentFiles\any\any">
<Pack>true</Pack>
<PackageCopyToOutput>true</PackageCopyToOutput>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
5、修改
WebHost
的專案檔案
匯入module.build.targets
檔案,新增複製_modules 目錄到輸出目錄的程式碼
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<!--複製本地鎖定的程式集到輸出目錄-->
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
<RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
<RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NetModular.Lib.Cache.MemoryCache" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Data.MySql" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Data.SQLite" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Data.SqlServer" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Excel.EPPlus" Version="1.7.2" />
<PackageReference Include="NetModular.Lib.Host.Web" Version="1.7.2" />
<PackageReference Include="NetModular.Module.Admin.Web" Version="1.7.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Web\Web.csproj" />
</ItemGroup>
<Import Project="..\..\build\module.build.targets" />
<ItemGroup>
<!--複製配置檔案到輸出目錄-->
<None Update="config\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<!--複製模組相關檔案到輸出路徑中-->
<None Update="_modules\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
6、修改
Web
中的ModuleInitializer.cs
類
IModuleInitializer
介面中的ConfigureServices
方法添加了IModuleCollection
引數,需要補上
/// <summary>
/// 注入服務
/// </summary>
/// <param name="services"></param>
/// <param name="modules"></param>
/// <param name="env"></param>
public void ConfigureServices(IServiceCollection services, IModuleCollection modules, IHostEnvironment env)
{
}
7、移除相容.Net Standard 2.0 版本的程式碼
8、剩下的根據異常資訊除錯吧~