# FasterBuild
**Repository Path**: huang_ling_xiao/faster-build
## Basic Information
- **Project Name**: FasterBuild
- **Description**: FasterBuild,更快的构建,开箱即用的公司级.net6 WebApi程序框架
内置自定义依赖注入,Json配置文件映射,Cron定时任务,Log组件、JWT认证等多种开箱即用功能,开源项目,可供修改使用。
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2022-09-02
- **Last Updated**: 2025-08-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Autowired, dotNet6, 开箱即用, 开源, WebApi
## README
# FasterBuild
## 介绍
FasterBuild,更快的构建,开箱即用的公司级.net6 WebApi程序框架
内置自定义依赖注入,Json配置文件映射,Cron定时任务,Log组件、JWT认证等多种开箱即用功能,开源项目,可供修改使用。
## 软件架构
net6
## 安装教程
1. NuGet搜索FastBuilder.NET 安装最新版本
2. Install-Package FastBuilder.NET -Version 1.0.1(替换成最新版本)
## 使用说明
```
- Program里输入以下代码
var builder = WebApplication.CreateBuilder(args);
builder.FastBuild((option, configuration) =>{});
```
## InitOption属性及方法介绍
#### UseJsonSetting(json模型匹配)
- class类和json文件的匹配注入
- 目的:配置文件单独储存,单独使用,隔离性强,方便维护
**相关特性:** [JsonFromAttribute](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#jsonfromattribute)、[ValueFromAttribute](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#valuefromattribute)

```
option.UseJsonSetting(settingOption =>
{
//需要注入的Setting文件存放的程序集名称 默认主程序集
settingOption.AssemblyName = "";
//模型类所在命名空间 默认xxxxx.Setting
settingOption.SettingModelNamespace = "";
//模型类对应的json文件存放文件夹名称(必须是根目录下)默认根目录下的SettingModel文件夹
settingOption.SettingJsonFolderName = "";
});
```
#### UseInjection(自定义DI注入)
目的:解决每新增一个服务就需要去添加一行注入代码这种繁琐工作
提供多种注入方式
- InjectionNamespace(一个命名空间下的整体注入)
- InjectionType(Type注入)
- InjectionServiceAndImplementationType(IService和Service注入)
- InjectionServiceAndImplementationNamespace(IService的命名空间和Service的命名空间 整体匹配注入)
- [Injection(DIPattern.Singleton)](特性注入,详情请看特性栏目)
**相关特性:** [InjectionIgnoreAttribute](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#injectionignoreattribute)
```
option.UseInjection(option =>
{
/*
示例:Namespace下的IService和Service的注入方式 其余方法可以f12到里面去看,都有注释
场景:
Repository:UserRepository,RoleRepository
IRepository:IUserRepository,IRoleRepository
原生需要一个一个去注入,比较麻烦,该方法只需要传入命名空间和匹配规则,就可实现一次性注入
*/
option.InjectionServiceAndImplementationNamespace(serviceNamespace: "Repository", iServiceNamespace: "IRepository", match: "I{Implementation}", dIPattern: DIPattern.Singleton, assemblyName: "");
});
```
#### UseGlobalRequestLog(访问日志配置)
注意*:访问日志存储路径在 /Logs/Request 文件夹中
```
option.UseGlobalRequestLog(log =>
{
//在启用jwt配置以后 设置请求日志的唯一值,比如userid等,默认为null请求日志不会存唯一值
log.RequestLogUniqueKey = (token) => { return token; };
});
```
#### UseIISRestart(IISRestart dispose后释放重启)
目的:为了解决iis回收导致程序中持续任务停止的问题,需搭配另外一套重启程序来实现 具体可以看iisOption中的注释
提供一个重启后的触发事件,实现IRestart,然后注入该类即可
```
option.UseIISRestart((iisOption) =>
{
iisOption.ThisApplicationIpHost = "";
iisOption.IISRestartTaskIpHost = "";
});
```

#### UseTimeJob(使用定时任务)
**详情**看 [TimeJob定时任务](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#timejob定时任务) 一栏介绍
```
option.UseTimeJob((toption) =>
{
//任务setting的文件地址,默认为Setting/TimedJobSetting.json
toption.JobSettingPath = "";
});
```
## 功能介绍
#### Log模块
- 注入即可使用 存储在程序根目录下的Logs文件夹下面
- 异步存储 无需担心性能问题
- 提供三个基础方法 存储介质:log文件
```
public WxController(ILog log)
{
}
```
#### Swagger
- 注意*:需要生成对应xml文件
- 访问地址:根目录/swagger/index.html
#### TimeJob定时任务
- 使用Cron表达式
**相关特性:** [ExecuteNowAttribute](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#executenowattribute)、[SkipWhileExecutingAttribute](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#skipwhileexecutingattribute)
```
[SkipWhileExecuting, ExecuteNow]
public class TestTimeJob : JobBase
{
[Autowired]
public ILog _logger;
///
/// 执行方法
///
///
public override async Task Execute()
{
Console.WriteLine($"TestTimeJob {DateTime.Now}");
_logger.Info($"TestTimeJob {DateTime.Now}");
}
///
/// 完成回调 (不需要可以不重写)
///
///
///
public override async Task FinishCallBack(JobResultModel result)
{
Console.WriteLine($"TestTimeJob Execute Status:{result.Sutus}");
}
}
```
```
- Setting文件夹中添加TimedJobSetting.json
{
"TestTimeJob": "0/1 * * * * ?",
...
}
```
#### Jwt全局认证以及加解密
```
- appsetting.json中添加以下配置,即可开启全局Jwt认证
"Jwt": {
//是否开启全局认证
"OpenGlobalAuthentication": true,
//必须填写 否则认为不开启Jwt
"SecretKey": "FasterBuild",
//默认:20分钟 1200秒
"Lifetime": 1200,
//默认:Unauthorized
"ErrorMessage": "Unauthorized",
//请求Header中的Token名字,默认:Authorization
"HeaderName":"Authorization"
}
```
- 开启后request请求的header中需要添加配置中的HeaderName字段,否则就会返回401
- 框架提供新的Authorization,通过Authorization验证的接口返回时会在respone的header中添加配置中的HeaderName字段,前端可以拿到该字段进行下次接口请求来保证Authorization不会过期
- 不需要验证token的接口需要在方法上添加[AllowAnonymous]特性
```
- 框架提供jwt加解密帮助类 IJwtHelper,注入使用即可
private ILog _log;
private IJwtHelper _jwtHelper;
public TestController(ILog log, IJwtHelper jwtHelper)
{
_log = log;
_jwtHelper = jwtHelper;
}
```
#### Autowired属性获取容器注入实例
- 可以通过[Autowired]特性进行获取容器注入实例
- 还可以自己手动获取容器注入实例,提供了object和IServiceProvider的拓展方法,引用FastBuild既可使用
- 注*:该属性注入不影响net原有的构造函数获取容器注入实例
```
object:filter.WithAutowired(context.HttpContext.RequestServices);
IServiceProvider:app.Services.GetServiceWithAutowired();
```
**相关特性:** [AutowiredAttribute](https://gitee.com/huang_ling_xiao/faster-build/blob/master/README.md#autowiredattribute)
## Attribute
#### DefaultReturnAttribute
加到action或者controller上来实现不使用全局返回格式
```
[HttpGet("Wechat"), AllowAnonymous, DefaultReturn]
public string WxBinding([FromQuery] WeChatSignModel model)
{
try
{
_logger.LogInfo($"WxBinding_QueryString:{Request.QueryString.Value}");
if (_wxRepsitory.CheckWxBind(model))
{
_logger.LogInfo("WxBinding Success");
return model.Echostr;
}
else
{
_logger.LogInfo("WxBinding failure");
return "校验失败";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "WxBinding ERROR");
throw;
}
}
```
#### InjectionAttribute
使用特性注入
```
[Injection(DIPattern.Singleton)]
public class CommonHttpInvoke
{
}
```
#### InjectionIgnoreAttribute
注入忽略,跟注入相关的都可以加这个特性,例如jsonSetting,自定义Injection,加上以后就会自动忽略该类的注入
注意*:[InjectionIgnore]特性在IService和Service的注入方式中需添加到Service上才可实现过滤
```
[InjectionIgnore]
public class HolidayRepository
{
}
```
#### SkipWhileExecutingAttribute
TimeJob定时任务的特性,运行中是否跳过,不加则不跳过
```
[SkipWhileExecuting]
public class TestTimeJob : IJob
{
private ILog _logger;
public TestTimeJob(ILog logger)
{
_logger = logger;
}
public async Task Execute()
{
Console.WriteLine($"TestTimeJob {DateTime.Now}");
_logger.LogInfo($"TestTimeJob {DateTime.Now}", "TestTimeJob");
GC.Collect();
}
}
```
#### ExecuteNowAttribute
TimeJob定时任务的特性,服务启动是否立刻执行
```
[SkipWhileExecuting]
[ExecuteNow]
public class TestTimeJob : IJob
{
private ILog _logger;
public TestTimeJob(ILog logger)
{
_logger = logger;
}
public async Task Execute()
{
Console.WriteLine($"TestTimeJob {DateTime.Now}");
_logger.LogInfo($"TestTimeJob {DateTime.Now}", "TestTimeJob");
GC.Collect();
}
}
```
#### AutowiredAttribute
属性获取服务,仍可以使用构造函数获取服务
```
public class Testclass
{
[Autowired]
private ILog _logger;
public async Task TestMethod()
{
Console.WriteLine($"TestMethod{DateTime.Now}");
_logger.LogInfo($"TestMethod{DateTime.Now}", "Testclass");
}
}
```
#### JsonFromAttribute
UseJsonSetting特性,用来指定Json数据来源,不加则找类名一致的Json文件,相对路径
```
[JsonFrom(Path = "appsettings.json")]
public class DomainSetting
{
///
/// Api地址
///
public string ApiDomain { get; set; }
///
/// Web端地址
///
public string WebDomain { get; set; }
}
```
#### ValueFromAttribute
UseJsonSetting特性,用来指定属性值的来源,不加则找Json文件中字段名一致的数据
```
[JsonFrom(Path = "appsettings.json")]
public class DomainSetting
{
///
/// Api地址
///
[ValueFrom(Property="Domain")]
public string ApiDomain { get; set; }
///
/// Web端地址
///
public string WebDomain { get; set; }
}
```
## Exception
#### OutPutException(450异常)
抛出给用户看的 不进行日志记录,返回值中的Code为450
#### UnauthorizedException(401异常)
认证失败 不进行日志记录,返回值中的Code为401
## 公共帮助类
#### ServiceContainer(静态获取注入类)
```
ServiceContainer.GetService();
```
注意*:非Http请求中,获取Scope类型服务会当成Transient类型返回
#### ActionCustomAttributes(获取本次调用接口的所有Attributes,包含控制器上的)
注意*:该帮助类为Scoped注入,注入方式为Singleton的类中不能使用

后续新的功能使用方法会更新到此README中,持续更新中……