先给大家拜个晚年,祝大家身体健康,远离肺炎~

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 包中,当在模块中安装InfrastructureWeb包时,会自动把_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、剩下的根据异常信息调试吧~

NetModular 新年第一更以及升级指南(打造简单易用的.Net Core模块化快速开发框架~)的更多相关文章

  1. 全宇宙首个.NET5+Vue.js前后端分离以及业务模块化快速开发框架【NetModular】发布~

    最近.Net圈子很热闹啊,我也来凑凑,今天中午耗时长达半小时,把NetModular升级到了.NET5,详情查看分支https://github.com/iamoldli/NetModular/tre ...

  2. 企业IT管理员IE11升级指南【17】—— F12 开发者工具

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  3. 企业IT管理员IE11升级指南【5】—— 不跟踪(DNT)例外

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  4. 企业IT管理员IE11升级指南【8】—— Win7 IE8和Win7 IE11对比

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  5. 企业IT管理员IE11升级指南【9】—— IE10与IE11的功能对比

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  6. babel 7 简单升级指南

    babel 7 babel 7 发布两天了,试着对当前项目更新了下,仅此记录分享 主要改动参考 官方博客 官方升级指南 主要升级内容 不再支持放弃维护的 node 版本 0.10.0.12.4.5 使 ...

  7. Apache ShardingSphere 5.0.0 内核优化及升级指南

    经过近两年时间的优化和打磨,Apache ShardingSphere 5.0.0 GA 版终于在本月正式发布,相比于 4.1.1 GA 版,5.0.0 GA 版在内核层面进行了大量的优化.首先,基于 ...

  8. 企业IT管理员IE11升级指南【16】—— 使用Compat Inspector快速定位IE兼容性问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  9. 企业IT管理员IE11升级指南【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

随机推荐

  1. NET Core 3.1 PATCH HTTP 的使用注意事项

    使用Postman请求示例: 一.在Headers要声明请求类型Content-Type 二.body提交要使用raw,且声明为json格式传输 三.如果有authorization验证还需要带上(如 ...

  2. $HNOI2012\ $ 集合选数 状压$dp$

    \(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...

  3. spring之第一个spring程序

    spring具体描述: 轻量级 IOC:依赖注入 AOP:面向切片编程 容器:spring是一个容器,包含并且管理应用的生命周期 框架 一站式 一.搭建spring开发环境 在eclipse中新建一个 ...

  4. shell脚本一键配置本地yum源

    效果如图: #!/bin/bash #Author:GaoHongYu #QQ: #Time:-- :: #Name:yumgz.sh #Version:V1. CKGZ=$( df -Th | gr ...

  5. 06_URL参数截取

    1:如何获取URL传给子页面的参数: //获得参数(只对字母数字等有效,参数值为中文则不能传) function getQueryString(name) { var reg = new RegExp ...

  6. Win10系统下应用窗口任务栏居中效果

    实现步骤: 在资源管理器中新建文件夹,一定要保证文件夹内无任何文件 任务栏上鼠标右键,移动到工具栏上,选择新建工具栏 选择新建的空文件夹 空文件夹出现在任务栏后,鼠标可以拖动工具栏前的两条竖线(图片上 ...

  7. InnoDB与MyISAM的区别(高性能MySQL笔记)

    1.InnoDB支持事务,MyISAM不支持,也就是说MyISAM不支持事务回滚操作,这个功能可能是致命的 2.InnoDB支持行锁,MyISAM只支持表锁,不过InnoDB的行锁是建立在索引之上的, ...

  8. Spring AOP 基于AspectJ

    简介 AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式支持.因为Spring1.0的时候Aspectj还未出现; AspectJ1.5中新增了对 ...

  9. 四、JVM之栈与栈帧

    栈: 1.又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把 另一端称为栈底.其特性是先进后出. 2.栈是线程私有的,生命周期跟线程相同,当创 ...

  10. 字符串分类 - hash

    链接:https://www.nowcoder.com/acm/contest/141/E来源:牛客网 题目描述 Eddy likes to play with string which is a s ...