NetPro.EFCore

Package Description


Keywords
automapper, docker-compose, dotnetcore31, dotnetcore6, fluentvalidation, healthcheck, kubernetes, linux, microservice, mq, prometheus-metrics, redis, swagger, webapi, webapiclient, windows
License
MIT
Install
Install-Package NetPro.EFCore -Version 3.1.0

Documentation

NetPro

.NET Core NuGet

🕰️ 项目请参照

简要

.NetpPro 是一个基于.NetCore的插件化开发脚手架,支持以搭“积木”方式实现业务模块的开发,支持net6.0,核心包NetPro.Startup 只有16k即可支撑整个框架以插件方式进行开发。NetPro项目在基于核心包NetPro.Startup基础上提供了其他周边常用中间件,其核心封装逻辑也是尽可能的暴露原生方法,不对开发人员产生过多不必要的学习成本。 基于NetPro.Startup的有两个关键插件包:

  • NetPro.Web.Api 用于开发webapi项目
  • NetPro.Grpc 用于开发grpc项目

其他的所有NetPro中间件都是可插拔,按需引用,每个组件都相对轻量,没有强关联NetPro,即使非.NetPro框架也可使用。如果基于NetPro.Web.ApiNetPro.Grpc引用的NetPro中间件,支持引用即自动执行初始化逻辑。

架构图

提供的中间件包含不限于以下:

FreeSql,Autofac , Automapper,apollo,App.Metrics,

CsRedisCore,StackExchange.Redis,Serilog,

MiniProfiler,FluentValidation,IdGen,

MongoDb,Dapper,RedLock.Net,

Sentry,RabbitMQ.Client,SkyAPM,

Swagger,WebApiClient.Core,

TimeZoneConverter,healthcheck

exceptionless

使用

各组件已发布Nuget包,可单独使用,如需插件化和自动执行初始化请使用NetPro.Web.Api或者NetPro.Grpc
支持的组件

具体参考 NetPro\src\Template\API\Content(插模块插件)项目

webapi项目引用 NetPro.Web.Api NuGet 引用最新nuget即可

Package Manager方式: Install-Package NetPro.Web.Api -Version 3.1.2

.NET CLI 方式: dotnet add package NetPro.Web.Api --version 3.1.2

PackageReference:<PackageReference Include="NetPro.Web.Api" Version="3.1.2" />

.NET CLI 方式: paket add NetPro.Web.Api --version 3.1.2


通过脚手架创建项目(推荐)

1、安装netproapiNuGet脚手架

执行以下命令安装脚手架

dotnet new -i netproapi::* 

2、使用脚手架创建项目

在指定的项目文件夹中执行以下命令

dotnet new netproapi -n 项目名称

例如当前项目为IAM

dotnet new netproapi -n IAM

执行以上命令将自动创建WebApi代码解决方案

手动创建项目

  • 修改Program.cs
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Serilog;

var host = Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) => ApolloClientHelper.ApolloConfig(hostingContext, config, args))
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureKestrel(options =>
                    {
                    });
                }).UseSerilog();

host.Build().Run();
  • 增加 EndpointsStartup.cs文件配置 可加多个继承了INetProStartup接口的启动类来控制启动顺序和初始化 此文件继承INetProStartup接口,提供了microsoft原生依赖注入能力,所有组件注入放于此 ,Startup.cs将不接受组件注入
// <auto-generated>
//  UseEndpoints   
// </auto-generated>

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace NetPro.Web.Api
{
    /// <summary>
    /// Endpoints 
    /// </summary>
    public class EndpointsStartup : INetProStartup
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="services"></param>
        /// <param name="configuration"></param>
        /// <param name="typeFinder"></param>
        public void ConfigureServices(IServiceCollection services, IConfiguration configuration, ITypeFinder typeFinder)
        {

        }

        /// <summary>
        /// Endpoints请求管道;
        /// Order执行顺序保证在RoutingStartup(200)之后即可
        /// </summary>
        /// <param name="application"></param>
        /// <param name="env"></param>
        public void Configure(IApplicationBuilder application, IWebHostEnvironment env)
        {
            application.UseEndpoints(s =>
            {
                s.MapControllers();
            });
        }

        /// <summary>
        /// UseEndpoints can be executed after RoutingStartup
        /// </summary>
        public double Order { get; set; } = 1000;
    }
}
  • 修改appsettings.json 文件
{
	"TypeFinderOption": {
		"MountePath": ""//插件挂载路径
	},
	"Serilog": {
		"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Async", "Serilog.Sinks.File" ],
		"MinimumLevel": {
			"Default": "Information",
			"Override": {
				"Default": "Error",
				"Microsoft": "Debug",
				"System": "Debug",
				"System.Net.Http.HttpClient": "Debug",
				"Microsoft.Hosting.Lifetime": "Information"
			}
		},
		"WriteTo:Async": {
			"Name": "Async",
			"Args": {
				"configure": [
					{ "Name": "Console" }
				]
			}
		},
		"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
		"Properties": {
			"Application": "Netpro"
		}
	},

	//**********以上日志***************

	"AllowedHosts": "*",

	"SwaggerOption": {
		"Enabled": true
	}
}

  • 启动前设置环境变量开启增强启动
Environment.SetEnvironmentVariable("ASPNETCORE_HOSTINGSTARTUPASSEMBLIES", "NetPro.Startup")
  • Controller使用

Controller继承原生ControllerBase即可,使用也参考官方原生接口开发

	/// <summary>
	///
	/// </summary>
	[Route("api/v1/[controller]")]
	public class WeatherForecastController : ControllerBase
	{
		private readonly ILogger _logger;
		private IExampleProxy _userApi { get; set; }

		public WeatherForecastController(ILogger logger
			 ,IExampleProxy userApi)
		{
			_logger = logger;
			_userApi = userApi;
		}
	}

约定

  • Service 业务相关
  • Repository 数据仓储相关(需要直接在Service或Controller中直接操作数据库可无需使用此后缀)
  • Proxy 代理请求相关(请求远程接口使用)
  • Aggregate 聚合相关,当Service 或者Controller 业务逻辑繁琐复杂可在此聚合后再调用

发布

发布自包含应用
dotnet publish -r linux-x64 -c release /p:PublishSingleFile=true /p:PublishTrimmed=true
依赖CLR运行时应用
dotnet publish -r linux-x64 -c release

运行

开发环境运行后效果如下:

 ____  _____        _   _______
|_   \|_   _|      / |_|_   __ \
  |   \ | |  .---.`| |-' | |__) |_ .--.   .--.
  | |\ \| | / /__\\| |   |  ___/[ `/'`\]/ .'`\ \
 _| |_\   |_| \__.,| |, _| |_    | |    | \__. |
|_____|\____|'.__.'\__/|_____|  [___]    '.__.'


[17:40:03] dotnet process id:14520
The enhanced service has started
[17:40:04] loading json files
Service injection sequence:
[17:40:15] apollo已关闭
info: NetProSwaggerServiceExtensions[0]
      NetPro Swagger 已启用
--------------------------------------------------------------------------------------------------------------------------------------
|    Order   |       StartupClassName       |                   Path                   |             Assembly            |  Version  |
--------------------------------------------------------------------------------------------------------------------------------------
| 0          | NetProCoreStartup            | NetPro.Core.Startup.NetProCoreStartup    | NetPro.Core                     |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 0          | CheckerStartup               | NetPro.Analysic.CheckerStartup           | NetPro.Checker                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 0          | ErrorHandlerStartup(default) | NetPro.Web.Api.ErrorHandlerStartup       | NetPro.Web.Api                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 100        | SwaggerStartup               | NetPro.Swagger.SwaggerStartup            | NetPro.Swagger                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 100        | StaticFilesStartup(default)  | NetPro.Web.Api.StaticFilesStartup        | NetPro.Web.Api                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 200        | RoutingStartup(default)      | NetPro.Web.Api.RoutingStartup            | NetPro.Web.Api                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 300        | CorsStartup                  | NetPro.Web.Api.CorsStartup               | NetPro.Web.Api                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 400        | ShareBodyStartup             | NetPro.ShareRequestBody.ShareBodyStartup | NetPro.NetProShareRequestBody   |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 1000       | EndpointsStartup(default)    | NetPro.Web.Api.EndpointsStartup          | XXX.API (custom)                |  1.0.0.0  |
--------------------------------------------------------------------------------------------------------------------------------------
| 1000       | NetProCsRedisStartup         | NetPro.CsRedis.NetProCsRedisStartup      | NetPro.CsRedis                  |  3.1.13.0 |
--------------------------------------------------------------------------------------------------------------------------------------
| 2147483647 | ApiStartup                   | XXX.API.ApiStartup                       | XXX.API (custom)                |  1.0.0.0  |
--------------------------------------------------------------------------------------------------------------------------------------
| 2147483647 | ApiStartup-1                 | XXX.Plugin.Web.Demo.ApiStartup           | XXX.Plugin.Web.Demo (custom)    |  1.0.0.0  |
--------------------------------------------------------------------------------------------------------------------------------------
| 2147483647 | ApiStartup-2                 | XXX.Plugin.Web.Manager.ApiStartup        | XXX.Plugin.Web.Manager (custom) |  1.0.0.0  |

第一次初始化会自动在程序当前目录生成startup.json文件可修改对应Order来覆盖各中间件默认执行顺序

{
  "NetProCoreStartup": 0,
  "CheckerStartup": 0,
  "ErrorHandlerStartup": 0,
  "SwaggerStartup": 100,
  "StaticFilesStartup": 100,
  "RoutingStartup": 200,
  "CorsStartup": 300,
  "ShareBodyStartup": 400,
  "EndpointsStartup": 1000,
  "ApiStartup": 2147483647,
  "ApiStartup-1": 2147483647,
  "ApiStartup-2": 2147483647
}

插件方式开发

可将开发好的dll丢入TypeFinderOption:MountePath 配置的文件路径中,即可自动加载当前dll无需工程文件引用

Swagger地址:/swagger/index.html

健康检查地址 /health

健康检查面板/ui

应用信息 /info

环境信息 /env

问题汇总

1. 如何覆盖系统异常处理

var mvcBuilder = services.AddControllers(config =>
   {
    config.Filters.Add(typeof(CustomerExceptionFilter),2);//自定义全局异常过滤器//100是order值,越大越靠后加载
});

...

Target

  • Microsoft.SourceLink.Github 加入
  • 可视化安装卸载组件

...