1. 程式人生 > >NetModular 新年第一更以及升級指南(打造簡單易用的.Net Core模組化快速開發框架~)

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 檔案,並自動將該檔案打包進InfrastructureWeb對應的 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、剩下的根據異常資訊除錯吧~