前言
Mbp(https://github.com/mbpframework/Mbp)是一个.NET Core 3 的企业级 Web 开发框架,是我个人用于学习.NET Core 而发起的一个开源项目.这个借鉴了国外优秀开源项目abp vnext,及国内优秀开源框架 Osharp 的一些思想和实现.欢迎各路开发爱好者加入这个项目,一起学习,一起玩耍,共同成长!
Mbp 目前有:
-
简单的模块化系统,
-
基于 Jwt 的统一身份验证,
-
基于角色和自定义策略的统一授权系统,
-
集成了 swagger ui 的 poco controller
-
集成了 ef core
-
提供 AOP 机制
后面还会继续加入 Hangfire,IentityServer4,NServiceBus,RabbitMQ,SignalR,Redis,ML,ES,Multitenancy,virtualfilesystem 等等.
下面简单介绍一下 Mbp 的这个框架吧.首先介绍下整个模块化框架的构成.
1、模块按照等级分为核心模块,组件级模块和应用级模块.核心模块默认为 Mbp.Core.框架里面其他的模块都为组件级模块,模块之间会按照依赖关系顺序加载(这是一个 to do 项).因为目前模块比较少,启动也不会出问题,后续指定了依赖关系就会好很多拉.运行的时候 Mbp 会作为一个中间件加入到 asp.net core的管道中.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 使用医学大数据开发平台框架
app.UseMedicalFramework();
// 路由中间件
app.UseRouting();
// 鉴权中间件
app.UseAuthorization();
// 路由终结点配置 开启终结点之后,mbp 的权限过滤器将以中间件的形式独立运行,不会再添加到 ActionDescriptor
// 也就是说,我们不要选择以这种方式来拦截和自定义鉴权算法
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
2、Mbp.Core 是框架的核心,其主要职责是将其他模块的服务注册到依赖注入系统中,同时把相关的中间件加到 asp.net core管道中.同时提供了一些底层的抽象定义.
3、Mbp.AspNetCore 是针对 asp.net core体系封装的一个基本模块,同时这也是 Mbp 一个很重要的模块,很多模块都继承了它.这个模块的主要职责是实现了 Poco controller 和一些筛选器以级基本的 asp,net core 的设置都在这个模块做定义.
4、Mbp.EntityFrameworkCore,这是对 EF Core 的一个封装的模块,这个模块主要定义了 Mbp 作为一个企业级开发框架的基本主数据.包括用户,角色,菜单,权限,操作日志等(这个模块有个 to do 项就是要支持主数据的扩展)
5、Mbp.Authentication,是统一授权管理,其主要职责是定义了框架的授权策略
public override IServiceCollection AddServices(IServiceCollection services)
{
// 添加全局授权策略
services.AddAuthorization(options =>
{
options.AddPolicy("GlobalPermission", policy => policy.Requirements.Add(new PermissionRequirement()));
});
return base.AddServices(services);
}
6、Mbp.Authentication.JwtBearer,是统一身份验证模块,其职责是配置授权身份认证,包括身份标识,设置验证参数,设置验证事件.
public override IServiceCollection AddServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var jwtConfig = serviceProvider.GetService<IOptions<MbpConfig>>().Value?.Jwt;
services.TryAddScoped<IJwtBearerService, JwtBearerService>();
//配置授权
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(jwtBearerOptions =>
{
// 设置验证参数
jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)),
ValidateIssuer = true,
ValidIssuer = jwtConfig.Issuer,
ValidateAudience = true,
ValidAudience = jwtConfig.Audience,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromMinutes(jwtConfig.TimeOut)
};
// 设置验证事件
jwtBearerOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add("action", "timeOut");
}
return Task.CompletedTask;
}
};
});
return base.AddServices(services);
}
public override void UseModule(IApplicationBuilder app)
{
app.UseAuthentication();
base.UseModule(app);
}
7、Mbp.Ddd.Application,此模块主要是为了辅助实施 DDD 而做的,其主要职责是负责 DDD 应用层的相关能力的提供,比如定义 Dto,扩展分页查询.
8、Mbp.Swagger,此模块是为框架提供 web api接口UI 界面.
9、Mbp.LogDashboard,此模块是为框架提供框架运行日志分析的 UI 界面.
下一节,将介绍我是如何用这些模块构建一个 web 应用的.