先給大家拜個晚年,祝大家身體健康,遠離肺炎~
NetModular開源已有一年,在這一年收到了很多建議,框架也變得越來越完善。這次更新包括了從去年年尾到現在所做的更改,感覺更改的內容還是蠻多的,所以記錄一下並提供一個升級指南供大家參考~
老規矩,先上地址~
源碼
GitHub:https://github.com/iamoldli/NetModular
碼雲:https://gitee.com/laoli/NetModular
歡迎star~
文檔
演示地址
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、剩下的根據異常信息調試吧~
