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

先給你們拜個晚年,祝你們身體健康,遠離肺炎~前端

NetModular開源已有一年,在這一年收到了不少建議,框架也變得愈來愈完善。此次更新包括了從去年年尾到如今所作的更改,感受更改的內容仍是蠻多的,因此記錄一下並提供一個升級指南供你們參考~git

老規矩,先上地址~github

源碼

GitHub:https://github.com/iamoldli/NetModular
碼雲:https://gitee.com/laoli/NetModular數據庫

歡迎star~json

文檔

https://docs.17mkh.com/後端

演示地址

Demo:https://demo.17mkh.com/
帳戶:admin
密碼:admin緩存

更新日誌 2020-02-10

後端

0、添加緩存管理功能,當沒法鏈接緩存服務器時,可在後臺對緩存進行清除管理服務器

一、實現 Token 自動刷新功能,系統設置頁面可設置RefreshToken的有效期app

二、實現單帳戶登陸功能,同一個帳戶只能同時登陸一個,該功能可在系統配置頁面進行關閉或啓用框架

三、從原來的帳戶服務IAccountService中剝離出身份認證服務IAuthService

四、修改模塊配置管理功能,統一管理全部模塊的配置項,移除原來的module.json配置文件

你們應該都遇到過這樣一個場景:項目經理提出一個新的需求,該需求須要作到靈活可配置的,大部分人都會選擇在配置文件中添加一個配置項來解決此問題,那麼問題來了,這個配置可能會常常修改,每次修改都要鏈接服務器修改配置文件,項目經理一定會找你來該,若是此時你正忙於其它事情,必定會感受很煩躁~而後你會考慮把配置放到數據庫中,在後臺提供頁面進行修改,那麼問題又來了,爲了一兩個配置建立一張表而且還要開發頁面,是否是很麻煩~因此便有了模塊配置管理這個功能

只須要按照約定,頂一個配置類,不須要關係存儲和更新,直接在用到的地方注入你定義的配置類就能使用~

五、調整模塊發現註冊機制

原來是從模塊的Infrastructure程序集中,讀取_module.json 文件來發現模塊並註冊,如今調整爲從應用根目錄的_modules目錄下發現_module.json 文件,這次更改是爲了之後開發模塊熱插拔功能作準備

六、調整模塊生成 NuGet 包的機制

如今編譯生成 NuGet 包時候,會自動生成_modules 目錄以及_module.json 文件,並自動將該文件打包進InfrastructureWeb對應的 NuGet 包中,當在模塊中安裝InfrastructureWeb包時,會自動把_module.json 文件複製到輸出模塊,而後模塊就能被發現註冊了

七、新增模塊業務服務注入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 有關,由於控制檯應用中是不包含這些的

八、調整了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);

九、新增自動建立數據庫後初始化數據功能

若是您想在系統自動建立數據庫後,初始化一些數據,可在db.json文件中,添加InitData屬性,設置爲 true 便可,他會在系統啓動時而且建立數據庫後初始化數據(前提是對應模塊包含了初始化數據)

若是您但願模塊建立數據庫後能夠初始化數據,只須要要數據庫腳本放到 WebHost 中的_modules 目錄中,以 Admin 爲例

腳本會自動打包進 NuGet 包中,安裝後會自動輸出到數據路徑~

九、我的精力有限,代碼不在兼容.Net Core2.2 版本,望諒解~

十、代碼優化~

前端

0、列表頁組件(nm-list)新增reset事件以及不顯示重置按鈕的屬性no-reset

一、修復下拉框組件checked-first屬性不生效的 bug

二、修復列表頁組件當查詢欄不顯示時,爲判斷 querybar 對象是否存在而致使查詢異常的 bug

三、調整身份認證相關的功能,以適配後端所作的調整,如單帳戶登陸等功能

四、調整系統配置頁面

模塊

0、調整全部模塊代碼,以便支持新的框架中的功能調整,好比配置管理的功能

一、優化了代碼生成器模塊,修復了打開實體列表時偶發性出現接口錯誤的 bug

二、代碼生成器模塊支持單個實體代碼生成,生成的文件中只包含實體有關的,生成後可直接 copy 到項目中

升級指南

因爲本次更新較大,須要修改多個地方,包括項目文件等,因此提供一個指南方便你們操做,若有疑問,可參考 Common 模塊~

0、修改 Directory.Build.props 文件

新增一個Icon屬性,用於指定模塊的展現圖標,目前該圖標只在配置管理中用到~

一、由於模塊信息添加了一個圖標屬性,因此對應的表ModuleInfo須要添加一個列Icon

二、修改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>

三、修改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>

四、修改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>

五、修改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>

六、修改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)
{

}

七、移除兼容.Net Standard 2.0 版本的代碼

八、剩下的根據異常信息調試吧~

相關文章
相關標籤/搜索